📅  最后修改于: 2023-12-03 15:33:54.790000             🧑  作者: Mango
在使用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()函数显示组合框。
运行上面的代码,我们可以看到效果如下:
当鼠标悬停在组合框上时,组合框的边框将被高亮显示。