PyQt5 – 当鼠标悬停时设置复选框指示器的皮肤

  • Post category:Python

PyQt5是Python语言的一个GUI库,提供了开发图形界面的框架和功能,开发者可以利用它来快速开发界面应用。

在PyQt5中,可以通过setProperty()方法来设置控件的样式属性。设置复选框指示器的皮肤也可以通过这个方法来实现。具体实现步骤如下:

  1. 导入必要的模块
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QCursor
from PyQt5.QtWidgets import QApplication, QCheckBox, QWidget, QVBoxLayout
  1. 创建窗口和复选框控件
app = QApplication([])
window = QWidget()
layout = QVBoxLayout(window)
checkbox = QCheckBox('This is a checkbox')
layout.addWidget(checkbox)
window.show()
  1. 设置鼠标悬停时的样式
checkbox.setProperty('hover', 'true')
checkbox_style = """
QCheckBox:hover {
    border: 2px solid #0078d7;
    border-radius: 3px;
}
QCheckBox:checked:hover {
    border: 2px solid #0078d7;
    background color: #0078d7;
}
"""
checkbox.setStyleSheet(checkbox_style)

以上代码中setProperty()方法接受两个参数,第一个参数为属性名,第二个参数为属性值。样式表中指定’d:hover’表示当鼠标悬停在复选框上方时,对应的样式生效。同时,由于我们需要设置复选框选中时的样式,还需要设置’checked:hover’来达到预期效果。

以下是一个完整的示例程序:

from PyQt5.QtCore import Qt
from PyQt5.QtGui import QCursor
from PyQt5.QtWidgets import QApplication, QCheckBox, QWidget, QVBoxLayout

app = QApplication([])
window = QWidget()

layout = QVBoxLayout(window)

checkbox = QCheckBox('This is a checkbox')
layout.addWidget(checkbox)

checkbox.setProperty('hover', 'true')

checkbox_style = """
QCheckBox:hover {
    border: 2px solid #0078d7;
    border-radius: 3px;
}
QCheckBox:checked:hover {
    border: 2px solid #0078d7;
    background color: #0078d7;
}
"""

checkbox.setStyleSheet(checkbox_style)

window.show()
app.exec_()

在这个示例中,当鼠标悬停在复选框上时,复选框的指示器会变成蓝色边框,同时选中的时候会变成蓝色背景和白色对勾。

除了样式表,还可以通过QProxyStyle类的子类来自定义复选框、单选框等控件的样式。

以下是一个使用QProxyStyle子类实现的完整示例程序:

from PyQt5.QtCore import Qt
from PyQt5.QtGui import QBrush, QColor, QPainter
from PyQt5.QtWidgets import QApplication, QCheckBox, QWidget, QVBoxLayout, QStyleFactory, QProxyStyle

class CustomStyle(QProxyStyle):
    def subElementRect(self, element, option, widget):
        if element == QStyle.SE_CheckBoxIndicator:
            rect = super(CustomStyle, self).subElementRect(element, option, widget)
            size = rect.height() - 4
            return Qt.QRect(rect.x() + 2, rect.y() + 2, size, size)
        return super(CustomStyle, self).subElementRect(element, option, widget)

    def drawPrimitive(self, element, option, painter, widget):
        if element == QStyle.PE_IndicatorCheckBox:
            rect = self.subElementRect(QStyle.SE_CheckBoxIndicator, option, widget)
            brush = QBrush(QColor(255, 255, 255, 128))
            painter.fillRect(rect, brush)
            if option.state & QStyle.State_MouseOver:
                brush = QBrush(QColor(0, 120, 215, 128))
                painter.fillRect(rect, brush)
            if option.state & QStyle.State_On:
                pen = painter.pen()
                pen.setColor(Qt.white)
                painter.setPen(pen)
                painter.drawLine(rect.topLeft(), rect.bottomRight())
                painter.drawLine(rect.topRight(), rect.bottomLeft())
            else:
                pen = painter.pen()
                pen.setColor(Qt.gray)
                painter.setPen(pen)
                painter.drawLine(rect.topLeft(), rect.bottomRight())
                painter.drawLine(rect.topRight(), rect.bottomLeft())
            return
        super(CustomStyle, self).drawPrimitive(element, option, painter, widget)

app = QApplication([])
app.setStyle(CustomStyle())

window = QWidget()

layout = QVBoxLayout(window)

checkbox = QCheckBox('This is a checkbox')
layout.addWidget(checkbox)

window.show()
app.exec_()

这个示例中,我们首先创建了一个CustomStyle类并继承QProxyStyle,重载了绘制方法和子元素大小方法。在绘制方法中,通过QColor类来设置背景颜色,并且通过使用if语句来处理鼠标悬停和选中状态下的修改。在执行了Style()方法之后,界面上的复选框控件的皮肤就会变为我们自定义的状态了。