PyQt5 – 当鼠标悬停时为不可编辑的关闭状态组合框添加边框

  • Post category:Python

为不可编辑的关闭状态组合框添加边框的过程分为两个步骤:首先需要为Combobox添加hover事件并且判断其编辑状态,然后再根据状态添加/移除边框。

1. 为组合框添加hover事件

鼠标悬停在组合框上时会触发hover事件,判断组合框是否在编辑状态可以通过isEditable()函数实现。根据两个条件判断,我们可以定义一个悬停事件函数:

def on_combobox_hover(self):
    if not self.comboBox.isEditable():
        self.comboBox.setStyleSheet("border: 2px solid gray;")

在这个函数中,我们首先判断组合框是否为编辑状态,如果不是则为组合框添加边框,样式表使用“border: 2px solid gray;”命令添加边框。

2. 设置组合框的边框

为组合框添加边框可以使用样式表(qss)来实现,边框的大小、颜色和样式等可以根据具体需求进行适当调整。接下来,给出两种添加样式表的设置方法:

方法一:

先定义一个样式表,例如:

style = "QComboBox:hover:!editable{border: 2px solid gray;}"

在悬停事件函数中使用 setStyleSheet() 函数设置样式表:

def on_combobox_hover(self):
    if not self.comboBox.isEditable():
        self.comboBox.setStyleSheet(style)

这样设置即可在hover事件触发时为组合框添加边框。

方法二:

直接在构造函数中使用 setStyleSheet() 函数设置样式表:

def __init__(self):
    super().__init__()
    self.comboBox = QComboBox(self)
    self.comboBox.setFixedWidth(120)
    style = "QComboBox:hover:!editable{border: 2px solid gray;}"
    self.comboBox.setStyleSheet(style)
    self.comboBox.setEditable(False)
    self.comboBox.addItems(["item1", "item2", "item3"])
    self.comboBox.setGeometry(50,50,120,30)
    self.comboBox.show()

在这个例子中,我们在构造函数中即可为组合框添加边框样式。需要注意的是,这种方法设置样式表时需要在选择器中将组合框的editable状态设置为false,即:!editable,以确保只为不可编辑的组合框添加边框。

示例:

为了更好的理解和使用,这里我们给出两个示例:

示例一:
class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.comboBox = QComboBox(self)
        self.comboBox.setFixedWidth(120)
        self.comboBox.setStyleSheet("border:none")
        self.comboBox.setEditable(False)
        self.comboBox.addItems(["item1", "item2", "item3"])
        self.comboBox.setGeometry(50,50,120,30)
        self.comboBox.show()
        self.comboBox.installEventFilter(self)

    def eventFilter(self, obj, event):
        if obj == self.comboBox:
            if event.type() == QEvent.MouseMove:
                self.on_combobox_hover()
            elif event.type() == QEvent.Leave:
                self.comboBox.setStyleSheet("border:none")
        return QMainWindow.eventFilter(self, obj, event)

    def on_combobox_hover(self):
        if not self.comboBox.isEditable():
            self.comboBox.setStyleSheet("border: 2px solid gray;")

在这个例子中,我们使用 eventFilter() 函数来捕获鼠标移动和离开事件,根据状态判断是否为组合框添加边框样式。

示例二:
class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.comboBox = QComboBox(self)
        self.comboBox.setFixedWidth(120)
        style = "QComboBox:hover:!editable{border: 2px solid gray;}"
        self.comboBox.setStyleSheet(style)
        self.comboBox.setEditable(False)
        self.comboBox.addItems(["item1", "item2", "item3"])
        self.comboBox.setGeometry(50,50,120,30)
        self.comboBox.show()

这个例子中,我们直接使用 setStyleSheet() 函数为组合框添加边框样式,这种方法简单直观,适用于简单的组合框设置。