PyQt5 – 鼠标悬停在不可编辑的组合框上时的背景颜色

  • Post category:Python

要设置鼠标悬停在不可编辑的组合框(QComboBox)上时的背景颜色,我们可以使用QComboBox的样式表属性和Qt的伪状态。

QComboBox:!editable:hover {
    background-color: #D8D8D8;
}

上述CSS代码中,QComboBox是选择器,!editable是伪状态,:hover是伪类,background-color是属性。解释如下:

  • 选择器:用于选择要应用样式的对象,在此处选择QComboBox。
  • 伪状态:用于表示对象的状态,在此处使用!editable表示不可编辑的QComboBox,因为默认情况下,QComboBox是可编辑的,如果需要设置为不可编辑,请在代码中添加setEditable(False)
  • 伪类:用于表示鼠标悬停时的状态,在此处使用:hover表示鼠标悬停时的状态。
  • 属性:用于设置样式属性,在此处使用background-color设置背景颜色为灰色。

下面是两个示例说明:

示例1

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *


class Example(QWidget):

    def __init__(self):
        super().__init__()

        self.initUI()

    def initUI(self):

        combo = QComboBox(self)
        combo.addItem("Python")
        combo.addItem("Java")
        combo.addItem("C++")
        combo.move(50, 50)
        combo.setEditable(False)  # 不可编辑

        self.setGeometry(300, 300, 300, 200)
        self.setWindowTitle('Example')
        self.show()

    def changeBackground(self, e):
        if e.type() == QEvent.HoverEnter:
            e.setStyleSheet("QComboBox:!editable:hover {background-color: #D8D8D8;}")
        elif e.type() == QEvent.HoverLeave:
            e.setStyleSheet("QComboBox {!editable:background-color: #FFFFFF;}")


if __name__ == '__main__':

    app = QApplication(sys.argv)
    ex = Example()
    ex.setStyleSheet("QComboBox {!editable:background-color: #FFFFFF;}")
    ex.show()
    sys.exit(app.exec_())

在示例1中,我们定义了一个changeBackground方法,用于在鼠标悬停时设置样式表。我们将信号QEventHoverEnterHoverLeave与该方法相关联。在鼠标悬停时,我们设置样式表以反映样式更改。当鼠标移开时,我们将样式表重置为原始设置。

示例2

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *


class Example(QWidget):

    def __init__(self):
        super().__init__()

        self.initUI()

    def initUI(self):

        combo = QComboBox(self)
        combo.addItem("Python")
        combo.addItem("Java")
        combo.addItem("C++")
        combo.move(50, 50)
        combo.setEditable(False)  # 不可编辑

        css = """
        QComboBox:!editable:hover {
            background-color: #D8D8D8;
        }
        """
        combo.setStyleSheet(css)

        self.setGeometry(300, 300, 300, 200)
        self.setWindowTitle('Example')
        self.show()


if __name__ == '__main__':

    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

在示例2中,我们直接将样式表设置为CSS代码。这种方法要更加简单,因此适用于简单的情况。