PyQt5 – 当鼠标悬停时为选中的复选框设置皮肤

  • Post category:Python

下面是python的“PyQt5 – 当鼠标悬停时为选中的复选框设置皮肤”的完整使用攻略:

简介

PyQt5是一款Python的GUI图形界面开发库,它可以帮助我们方便地创建桌面应用程序。而复选框(QCheckBox)是常用的UI控件之一,可以用于让用户选择一个或多个选项。本攻略将介绍如何使用PyQt5为选中的复选框设置皮肤,从而增强UI界面的交互性。

步骤

准备工作

在使用PyQt5前,需要先安装它,可以使用pip进行安装:

pip install PyQt5

安装完成后,我们需要导入以下模块:

from PyQt5.QtWidgets import QWidget, QCheckBox, QApplication
from PyQt5.QtGui import QColor

创建QCheckBox对象

我们可以使用QCheckBox类来创建复选框,示例代码如下:

cb = QCheckBox('复选框')
cb.setChecked(True)

上述代码创建了一个名为cb的复选框对象,并将它的默认状态设置为选中。

创建QWidget窗口

我们需要在QWidget中创建一些QCheckBox对象用于演示,示例代码如下:

class Example(QWidget):

    def __init__(self):
        super().__init__()

        self.initUI()

    def initUI(self):

        cb = QCheckBox('复选框1', self)
        cb.move(20, 20)
        cb.toggle() #默认不选中
        cb.stateChanged.connect(self.changeTitle)

        cb1 = QCheckBox('复选框2', self)
        cb1.move(20, 40)
        cb1.toggle()#默认不选中
        cb1.stateChanged.connect(self.changeTitle)
        ...

    def changeTitle(self, state):

        source = self.sender()

        if state == Qt.Checked:
            self.setWindowTitle(source.text() + ' 选中')
        else:
            self.setWindowTitle(source.text() + ' 取消选中')

上述代码创建了一个名为Example的QWidget窗口对象,我们在它的initUI()方法中创建了两个QCheckBox对象,并将它们移动到窗口的指定位置。我们还为每个QCheckBox对象绑定了一个stateChanged信号,该信号会在复选框状态发生变化时发出,并调用changeTitle()函数更新窗口标题。

为选中的复选框设置皮肤

我们可以使用setStyleSheet()方法为选中的复选框设置皮肤,示例代码如下:

class Example(QWidget):

    def __init__(self):
        super().__init__()

        self.initUI()

    def initUI(self):

        cb = QCheckBox('复选框1', self)
        cb.move(20, 20)
        cb.toggle() #默认不选中
        cb.stateChanged.connect(self.changeTitle)

        cb1 = QCheckBox('复选框2', self)
        cb1.move(20, 40)
        cb1.toggle()#默认不选中
        cb1.stateChanged.connect(self.changeTitle)
        ...

    def changeTitle(self, state):

        source = self.sender()

        if state == Qt.Checked:
            self.setWindowTitle(source.text() + ' 选中')

            # 为选中的复选框设置皮肤
            if source.isChecked():
                source.setStyleSheet("color:red")
        else:
            self.setWindowTitle(source.text() + ' 取消选中')

            # 为未选中的复选框设置皮肤
            if not source.isChecked():
                source.setStyleSheet("color:black")

上述代码在changeTitle()方法中判断复选框的状态,如果复选框处于选中状态,则为它设置红色字体;如果复选框未被选中,则为它设置默认的黑色字体。我们可以使用setStyleSheet()方法来设置字体颜色,它接受一个CSS样式字符串作为参数。

示例说明

示例1

我们可以在窗口上创建多个复选框,然后当用户选中某个复选框时,为它设置红色字体,示例代码如下:

class Example(QWidget):

    def __init__(self):
        super().__init__()

        self.initUI()

    def initUI(self):

        cb = QCheckBox('复选框1', self)
        cb.move(20, 20)
        cb.toggle() 
        cb.stateChanged.connect(self.changeTitle)

        cb1 = QCheckBox('复选框2', self)
        cb1.move(20, 40)
        cb1.toggle()
        cb1.stateChanged.connect(self.changeTitle)

        ...

    def changeTitle(self, state):

        source = self.sender()

        if state == Qt.Checked:
            self.setWindowTitle(source.text() + ' 选中')

            # 为选中的复选框设置皮肤
            if source.isChecked():
                source.setStyleSheet("color:red")
        else:
            self.setWindowTitle(source.text() + ' 取消选中')

            # 为未选中的复选框设置皮肤
            if not source.isChecked():
                source.setStyleSheet("color:black")


if __name__ == '__main__':

    app = QApplication(sys.argv)
    ex = Example()
    ex.show()
    sys.exit(app.exec_())

上述代码创建了一个QCheckBox窗口并在窗口上创建了两个复选框。当用户选中复选框1或复选框2时,程序会为它们设置红色字体,解决了选中状态不易识别的问题。

示例2

我们可以通过继承QCheckBox类并重写enterEvent()和leaveEvent()方法,来实现当鼠标悬停在复选框上时为它设置皮肤的功能。示例代码如下:

class MyCheckBox(QCheckBox):

    def __init__(self, text, parent=None):
        super().__init__(text, parent)

    def enterEvent(self, event):
        self.setStyleSheet("color:red")

    def leaveEvent(self, event):
        if not self.isChecked():
            self.setStyleSheet("color:black")

上述代码创建了一个名为MyCheckBox的类,并继承了QCheckBox类。我们重写了enterEvent()和leaveEvent()方法,在鼠标进入复选框时为它设置红色字体,在鼠标离开复选框时为它设置默认的黑色字体。我们可以创建多个MyCheckBox对象,并将它们添加到窗口中,示例代码如下:

class Example(QWidget):

    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        cb1 = MyCheckBox('复选框1', self)
        cb1.move(20, 30)

        cb2 = MyCheckBox('复选框2', self)
        cb2.move(20, 60)

        cb3 = MyCheckBox('复选框3', self)
        cb3.move(20, 90)

if __name__ == '__main__':

    app = QApplication(sys.argv)
    ex = Example()
    ex.show()
    sys.exit(app.exec_())

上述代码创建了一个QWidget窗口对象Example,并在它的initUI()方法中创建了三个MyCheckBox对象。当鼠标移动到某个复选框上时,程序会将该复选框的字体设置为红色,使用户更容易注意到。