PyQt5 – 当鼠标悬停在不可编辑的OFF状态的组合框上时,设置背景颜色

  • Post category:Python

首先,我们需要导入PyQt5库中的QtWidgets模块,以便使用其中的QComboBox类,以及QApplication和QVBoxLayout类用于图形界面的创建和布局。

接下来,我们可以创建一个QComboBox对象,并将其设置为“只读”状态,同时为其添加几个选项。然后,我们可以通过下面的代码为鼠标悬停时的事件发送信号:

comboBox = QComboBox()
comboBox.setReadOnly(True)
comboBox.addItem("Option 1")
comboBox.addItem("Option 2")

comboBoxEntered = pyqtSignal()
comboBox.installEventFilter(self) # 在当前对象的事件过滤列表中添加组合框对象

在上面的代码中,我们创建了一个新的pyqtSignal对象,用于发出comboBox进入事件的信号。我们还在当前对象的事件过滤器列表中添加了comboBox对象。这意味着,当comboBox发生enterEvent事件时,将调用事件过滤器函数进行处理。

接着,在事件过滤器函数中我们可以使用以下方法来检查事件类型:

def eventFilter(self, obj, event):
    if obj == comboBox and event.type() == QEvent.Enter:
        comboBoxEntered.emit() # 发送comboBox进入事件的信号
        return True # 停止事件传播
    else:
        return super().eventFilter(obj, event) # 延续事件传播

在上面的代码中,我们检查了当前事件的类型是否为comboBox进入事件,如果是,则发出comboBoxEntered信号。此外,我们还返回了True,以防止事件继续传递。

在这一步之后,我们可以创建一个槽函数,以响应comboBoxEntered信号,并在其中使用以下代码来设置组合框的背景颜色:

def comboBoxEnteredSlot(self):
    if not comboBox.isEditable() and not comboBox.isEnabled(): # 如果组合框为只读和禁用状态
        comboBox.setStyleSheet("background-color: yellow;") # 设置背景颜色为黄色

在上面的代码中,我们首先检查组合框是否为只读和禁用状态,如果是,则设置背景颜色为黄色。

示例应用1:在PyQt5窗口中添加组合框和标签,并设置组合框的背景颜色

import sys
from PyQt5.QtCore import pyqtSignal, QEvent
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QVBoxLayout, QComboBox


class MyWindow(QWidget):
    def __init__(self):
        super().__init__()

        self.comboBox = QComboBox(self)
        self.comboBox.setReadOnly(True)
        self.comboBox.addItem("Option 1")
        self.comboBox.addItem("Option 2")

        self.label = QLabel("请将鼠标悬停在只读且禁用的下拉框上")
        vbox = QVBoxLayout()
        vbox.addWidget(self.label)
        vbox.addWidget(self.comboBox)
        self.setLayout(vbox)

        self.comboBoxEntered = pyqtSignal()
        self.comboBox.installEventFilter(self)

        self.comboBoxEntered.connect(self.comboBoxEnteredSlot)

    def eventFilter(self, obj, event):
        if obj == self.comboBox and event.type() == QEvent.Enter:
            self.comboBoxEntered.emit()
            return True
        else:
            return super().eventFilter(obj, event)

    def comboBoxEnteredSlot(self):
        if not self.comboBox.isEditable() and not self.comboBox.isEnabled():
            self.comboBox.setStyleSheet("background-color: yellow;")


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

示例应用2:在一个PyQt5应用程序中,添加多个组合框,并为每个组合框分别设置不同的背景颜色。

import sys
from PyQt5.QtCore import pyqtSignal, QEvent
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QComboBox


class MyWindow(QWidget):
    comboBoxes = [] # 存储组合框对象的列表

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

        for i in range(5):
            comboBox = QComboBox(self)
            comboBox.setReadOnly(True)
            comboBox.addItem("Option 1")
            comboBox.addItem("Option 2")
            comboBox.setStyleSheet("color: white; background-color: blue;") # 初始化背景颜色为蓝色
            self.comboBoxes.append(comboBox)

        vbox = QVBoxLayout()
        for comboBox in self.comboBoxes:
            vbox.addWidget(comboBox)

        self.setLayout(vbox)

        self.comboBoxEntered = pyqtSignal()
        for comboBox in self.comboBoxes:
            comboBox.installEventFilter(self)
            self.comboBoxEntered.connect(comboBox, QtCore.SIGNAL("entered()"), self.comboBoxEnteredSlot)

    def eventFilter(self, obj, event):
        if obj in self.comboBoxes and event.type() == QEvent.Enter: # 如果事件对象在列表中
            self.comboBoxEntered.emit() # 发送comboBox进入事件的信号
            return True
        else:
            return super().eventFilter(obj, event)

    def comboBoxEnteredSlot(self):
        sender = self.sender() # 获得发出comboBoxEntered信号的对象

        if not sender.isEditable() and not sender.isEnabled():
            sender.setStyleSheet("color: white; background-color: yellow;") # 将背景颜色修改为黄色


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

在上面的应用示例中,我们使用了一个列表来存储多个组合框对象,并为每个组合框对象分别设置了不同的背景颜色。在事件过滤器函数中,我们检查事件的对象是否在列表中,并向发出comboBox进入事件的信号的对象发送调用comboBoxEnteredSlot函数的信号。在comboBoxEnteredSlot函数中,我们首先获取发出信号的对象,然后检查它是否为只读且禁用状态,如果是,则将其背景颜色修改为黄色。