PyQt5 – 为打开状态的组合框设置背景图片

  • Post category:Python

首先需要安装 PyQT5,可以使用 pip 命令安装:

pip install PyQt5

然后在 Python 中导入相应库:

from PyQt5.QtWidgets import QComboBox, QApplication
from PyQt5.QtGui import QPixmap
from PyQt5.QtCore import Qt

接下来,我们可以通过继承 QComboBox 类来创建我们自己的组合框类。

class MyComboBox(QComboBox):
    def __init__(self):
        super().__init__()
        self.setStyleSheet("QComboBox{background-color:white}")

我们在自己的组合框类中设置了一个初始样式表,在这里我们将组合框的背景颜色设置为白色。

现在,我们可以通过覆盖 QComboBox 类的 paintEvent() 方法,来为组合框设置背景图片。

class MyComboBox(QComboBox):
    def __init__(self):
        super().__init__()
        self.setStyleSheet("QComboBox{background-color:white}")
        self.setFixedSize(150, 30)

    def paintEvent(self, event):
        painter = QPainter(self)
        option = QStyleOptionComboBox()
        self.initStyleOption(option)
        painter.drawPixmap(self.rect(), QPixmap('background.png'))
        self.style().drawComplexControl(QStyle.CC_ComboBox, option, painter, self)

我们利用 QPainter 对象绘制了背景图片,然后再调用父类的绘制方法将组合框本身绘制出来。

接下来,我们可以创建一个 QApplication 对象,来测试我们的自定义组合框类。

if __name__ == "__main__":
    import sys
    app = QApplication(sys.argv)
    combo = MyComboBox()
    combo.addItems(['apple', 'banana', 'cherry'])
    combo.show()
    sys.exit(app.exec_())

上面的代码创建了一个 MyComboBox 对象,添加了一些选项,并显示出来。运行程序,我们会看到在组合框里面添加了一张背景图片。

示例 1:

from PyQt5.QtWidgets import QComboBox, QApplication
from PyQt5.QtGui import QPainter, QBrush, QColor, QPixmap, QStyleOptionComboBox, QPalette
from PyQt5.QtCore import Qt

class MyComboBox(QComboBox):
    def __init__(self):
        super().__init__()
        self.setStyleSheet("QComboBox{background-color:white}")
        self.setFixedSize(150, 30)

    def paintEvent(self, event):
        painter = QPainter(self)
        option = QStyleOptionComboBox()
        self.initStyleOption(option)
        painter.drawPixmap(self.rect(), QPixmap('test.jpg'))
        self.style().drawComplexControl(QStyle.CC_ComboBox, option, painter, self)

if __name__ == "__main__":
    import sys
    app = QApplication(sys.argv)
    combo = MyComboBox()
    combo.addItems(['apple', 'banana', 'cherry'])
    combo.show()
    sys.exit(app.exec_())

在这个例子里面,我们将背景图片的文件名改为了 test.jpg。

示例 2:

from PyQt5.QtWidgets import QComboBox, QApplication
from PyQt5.QtGui import QPainter, QBrush, QColor, QPixmap, QStyleOptionComboBox, QPalette
from PyQt5.QtCore import Qt

class MyComboBox(QComboBox):
    def __init__(self):
        super().__init__()
        self.setStyleSheet("QComboBox{background-color:white}")
        self.setFixedSize(150, 30)

    def paintEvent(self, event):
        painter = QPainter(self)
        option = QStyleOptionComboBox()
        self.initStyleOption(option)
        painter.drawPixmap(self.rect(), QPixmap('https://img.alicdn.com/bao/uploaded/i1/725677994/O1CN01fwvxdm1OP8H3ujhJS_!!725677994.jpg'))
        self.style().drawComplexControl(QStyle.CC_ComboBox, option, painter, self)

if __name__ == "__main__":
    import sys
    app = QApplication(sys.argv)
    combo = MyComboBox()
    combo.addItems(['apple', 'banana', 'cherry'])
    combo.show()
    sys.exit(app.exec_())

在这个例子里面,我们加载了一个网络图片作为组合框的背景图片。