PyQt5组合框 向下箭头的背景图片

  • Post category:Python

了解PyQt5的开发者们都知道,组合框(QComboBox)是PyQt5开发中非常常用的控件之一。设置组合框可选择项时,我们可以使用 addItem() 函数添加文本字符串(也可以添加QIcon图标,此处不再详述),并通过调用 setIconSize() 函数设置下拉列表中图标的大小。

然而,在某些情况下,可能需要设置下拉列表中向下箭头按钮的背景图片(即突出显示下拉框的小三角形)。下面我们详细讲解一下如何实现此目的。

方法一:使用QSS样式表

一种设置组合框下拉按钮背景图的方法是使用QSS样式表。下面是一个简单示例:

from PyQt5.QtWidgets import QApplication, QComboBox, QWidget
import sys

class Demo(QWidget):
    def __init__(self):
        super(Demo, self).__init__()
        self.combobox = QComboBox(self)
        self.combobox.addItem('item1')
        self.combobox.addItem('item2')
        self.combobox.setStyleSheet('QComboBox::down-arrow {image: url(./dropbtn.png);}')

if __name__ == '__main__':
    app = QApplication(sys.argv)
    demo = Demo()
    demo.show()
    sys.exit(app.exec_())

上述代码中,我们通过应用 StyleSheet 设置了下拉按钮的背景图(.down-arrow)。需要注意的是,此处设置的是相对路径的 .png 文件,需要置于脚本目录下。

方法二:使用 paintEvent() 函数

在某些情况下,我们希望能够通过绘制事件(例如paintEvent() )稍作修改,而不是使用QSS。下面是一些示例代码,可以通过它来设置组合框按钮的背景图片:

from PyQt5.QtCore import QRect, Qt
from PyQt5.QtGui import QIcon, QPainter, QPixmap
from PyQt5.QtWidgets import QComboBox, QStylePainter, QStyle, QWidget
import sys

class MyComboBox(QComboBox):
    def paintEvent(self, event):
        painter = QStylePainter(self)
        painter.setRenderHint(QPainter.Antialiasing)
        painter.setRenderHint(QPainter.SmoothPixmapTransform)
        opt = QStyleOptionComboBox()
        self.initStyleOption(opt)
        painter.drawComplexControl(QStyle.CC_ComboBox, opt)

        rect = QRect(opt.rect.x() + opt.rect.width() - 20, opt.rect.y(), 20, opt.rect.height())
        arrow_icon = QIcon('dropbtn.png')
        painter.drawPixmap(rect, arrow_icon.pixmap(20, 20).transformed(QTransform().rotate(90, Qt.XAxis)))

        opt.currentText = self.currentText() or ""
        painter.drawControl(QStyle.CE_ComboBoxLabel, opt)

class Demo(QWidget):
    def __init__(self):
        super(Demo, self).__init__()
        self.combobox = MyComboBox(self)
        self.combobox.addItem('item 1')
        self.combobox.addItem('item 2')
        self.combobox.addItem('item 3')
        self.combobox.resize(200, 50)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    demo = Demo()
    demo.show()
    sys.exit(app.exec_())

上述代码中,我们自定义了 MyComboBox 类,继承自 QComboBox ,并重载了 paintEvent()。该函数中,我们根据父类设置的 QStyleOptionComboBox 对象,调用 drawComplexControl() 方法绘制组合框的背景和下拉按钮,并使用QIcon及其 pixmap() 方法将下拉按钮的背景图绘制到指定位置。

值得注意的是,此处也是使用相对路径(”./dropbtn.png”)设置按钮图标的,需要与脚本放在同一目录下。此外,突出显示下拉框的小三角形在该代码中逆时针旋转了90度,需要结合实际情况进行修改。