了解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度,需要结合实际情况进行修改。