📌  相关文章
📜  PyQt5 – 鼠标悬停时为可编辑关闭状态组合框添加边框(1)

📅  最后修改于: 2023-12-03 15:33:54.790000             🧑  作者: Mango

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

在使用PyQt5开发图形界面时,我们经常需要使用组合框(QComboBox)来提供选项列表,有时需要设置组合框为可编辑并且可以在鼠标悬停时添加一个边框效果,以提高界面的交互性。

下面是实现这个功能的代码:

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

class CustomComboBox(QComboBox):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        self.setMouseTracking(True)
        self.bordered = False
        self.setStyleSheet("QComboBox:hover { border: 1px solid #000000 };")

    def mouseMoveEvent(self, event):
        if event.pos().x() < self.width() and event.pos().y() < self.height():
            self.bordered = True
            self.update()
        else:
            self.bordered = False
            self.update()

    def paintEvent(self, event):
        painter = QStylePainter(self)
        option = QStyleOptionComboBox()
        self.initStyleOption(option)
        painter.drawComplexControl(QStyle.CC_ComboBox, option)

        if self.bordered:
            pal = self.palette()
            pal.setColor(QPalette.Normal, QPalette.WindowText, Qt.black)
            pal.setColor(QPalette.Normal, QPalette.Window, Qt.white)
            painter.setPen(Qt.black)
            painter.setBrush(Qt.NoBrush)
            painter.drawRect(event.rect().adjusted(2, 2, -2, -2))
            painter.setPen(Qt.NoPen)
            painter.setBrush(Qt.SolidPattern)
            painter.drawRect(event.rect().adjusted(-2, -2, 2, 2))

        painter.drawControl(QStyle.CE_ComboBoxLabel, option)

if __name__ == '__main__':
    app = QApplication([])
    combo = CustomComboBox()
    combo.setEditable(True)
    combo.addItems(['Item 1', 'Item 2', 'Item 3'])
    combo.show()
    app.exec_()
代码说明

这段代码定义了一个自定义的组合框CustomComboBox,继承自QComboBox。

在构造函数中,我们设置了组合框的鼠标跟踪属性为True,并且初始化边框的状态为False,设置了组合框的鼠标悬停时的样式为边框的样式。

在mouseMoveEvent()函数中,我们检查当前鼠标是否在组合框的矩形内,如果是,则设置边框状态为True,否则设置状态为False,然后更新界面。

在paintEvent()函数中,我们使用QStylePainter绘制组合框,然后在需要绘制边框的地方设置边框的颜色和样式,最后再绘制组合框的标签。

在main()函数中,我们创建了一个CustomComboBox实例,设置了可编辑属性,并且添加了选项列表,最后调用show()函数显示组合框。

运行效果

运行上面的代码,我们可以看到效果如下:

效果图

当鼠标悬停在组合框上时,组合框的边框将被高亮显示。