PyQt5组合框 当鼠标悬停在关闭状态时,不同的边框大小

  • Post category:Python

PyQt5是一个广泛使用的Python GUI库,支持创建各种窗口应用程序。其中组合框(QComboBox)可以提供一个下拉列表,方便用户进行选择。本文将详细讲解如何实现组合框的鼠标悬停效果。

使用QSS设置组合框的鼠标悬停效果

QSS是PyQt5提供的一种样式表,可以通过设置样式表来修改控件的外观。我们可以通过设置QSS,来改变组合框当鼠标悬停在关闭状态时显示的边框大小。下面是示例代码:

from PyQt5.QtWidgets import QApplication, QComboBox, QWidget, QVBoxLayout
from PyQt5 import QtCore

app = QApplication([])

widget = QWidget()
layout = QVBoxLayout()

combo_box = QComboBox()
combo_box.addItems(['item 1', 'item 2', 'item 3'])
combo_box.setStyleSheet('''
QComboBox {{
    border: 1px solid gray;
    border-radius: 3px;
    padding: 1px 18px 1px 3px;    
}}

QComboBox:hover {{
    border: 2px solid blue;
}}
''')

layout.addWidget(combo_box)
widget.setLayout(layout)

widget.show()
app.exec_()

在上面的示例中,我们通过设置QComboBox的样式表来修改其边框的大小和颜色。border属性可以设置边框的宽度和颜色,border-radius属性可以设置边框的圆角。我们通过设置padding属性来调整下拉列表的位置,使其与边框之间有一定的间隔。

接着,通过设置QComboBox:hover伪状态来实现鼠标悬停效果。当鼠标悬停在组合框上时,边框变为2px宽,颜色变为蓝色。

使用QPainter绘制组合框的鼠标悬停效果

除了使用QSS外,我们还可以通过在组合框的paintEvent()方法中绘制边框来实现鼠标悬停效果。下面是示例代码:

from PyQt5.QtWidgets import QApplication, QComboBox, QWidget, QVBoxLayout
from PyQt5.QtGui import QPainter, QPen
from PyQt5 import QtCore

class CustomComboBox(QComboBox):
    def __init__(self, parent=None):
        super().__init__(parent)

        self.setStyleSheet('''
            QComboBox {{
                padding: 1px 18px 1px 3px;
            }}
        ''')

        self.hovered = False

    def enterEvent(self, event):
        self.hovered = True
        self.update()

    def leaveEvent(self, event):
        self.hovered = False
        self.update()

    def paintEvent(self, event):
        painter = QPainter(self)
        painter.setRenderHint(QPainter.Antialiasing)

        pen = QPen()
        pen.setWidth(1)
        pen.setStyle(QtCore.Qt.SolidLine)
        if self.hovered:
            pen.setColor(QtCore.Qt.blue)
            pen.setWidth(2)
        else:
            pen.setColor(QtCore.Qt.gray)

        painter.setPen(pen)
        painter.drawRoundedRect(0, 0, self.width()-1, self.height()-1, 3, 3)

        super().paintEvent(event)

app = QApplication([])

widget = QWidget()
layout = QVBoxLayout()

combo_box = CustomComboBox()
combo_box.addItems(['item 1', 'item 2', 'item 3'])

layout.addWidget(combo_box)
widget.setLayout(layout)

widget.show()
app.exec_()

在上面的示例中,我们自定义了一个CustomComboBox类,继承自QComboBox。在该类中,我们重载了enterEvent()leaveEvent()方法,当鼠标进入或离开时,设置hovered属性并更新组合框。然后,我们又重载了paintEvent()方法,在该方法中使用QPainter绘制边框。根据hovered属性的值,选择不同的颜色和线宽。

以上两种方法都可以实现组合框的鼠标悬停效果,根据实际需求选择适合自己的方法即可。