PyQt5 – 复选框的背景颜色

  • Post category:Python

下面来详细讲解如何使用PyQt5实现复选框的背景颜色设置。

1. 安装PyQt5

在开始使用PyQt5时,首先需要先安装PyQt5库。可以通过pip命令来安装PyQt5:

pip install PyQt5

2. 创建复选框

使用PyQt5创建复选框,可以使用QCheckBox类。示例如下:

from PyQt5.QtWidgets import QApplication, QWidget, QCheckBox
import sys

class CheckBoxDemo(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        # 创建复选框
        cb = QCheckBox('复选框', self)
        cb.move(20, 20)
        cb.toggle()
        cb.stateChanged.connect(self.changeTitle)

        self.setGeometry(300, 300, 250, 150)
        self.setWindowTitle('复选框')
        self.show()

    def changeTitle(self, state):
        if state == 0:
            self.setWindowTitle('复选框')
        else:
            self.setWindowTitle('选中复选框')

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = CheckBoxDemo()
    sys.exit(app.exec_())

上述代码中,我们创建了一个复选框,并设置了默认文本。同时,我们还为复选框的状态变化事件绑定了一个槽函数changeTitle,可以根据复选框的选中状态来修改窗口的标题。

3. 设置复选框的背景颜色

设置复选框的背景颜色,可以通过QCheckBox.setStyleSheet()方法来实现。方法中可以设置CSS样式,并为复选框元素设置CSS属性。示例如下:

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

class CheckBoxDemo(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        # 创建复选框
        cb = QCheckBox('复选框', self)
        cb.move(20, 20)
        cb.toggle()
        cb.setCheckable(True)

        # 设置复选框的背景颜色
        cb.setStyleSheet('QCheckBox::indicator:checked{background-color:red;}')

        cb.stateChanged.connect(self.changeTitle)

        self.setGeometry(300, 300, 250, 150)
        self.setWindowTitle('复选框')
        self.show()

    def changeTitle(self, state):
        if state == 0:
            self.setWindowTitle('复选框')
        else:
            self.setWindowTitle('选中复选框')

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = CheckBoxDemo()
    sys.exit(app.exec_())

上述代码中,我们通过调用QCheckBox的setStyleSheet()方法,为复选框设置CSS样式,其中QCheckBox::indicator:checked表示复选框被选中时的状态。在CSS样式中,我们为这种状态设置了background-color属性,以设置复选框被选中时的背景颜色。

4. 示例说明

下面通过两个示例来说明如何使用PyQt5设置复选框的背景颜色。

示例1

如下代码中,我们创建了三个复选框,分别对应不同的颜色。当用户选中其中一个复选框时,程序将根据所选的复选框背景颜色,并将背景颜色设置为窗口的背景颜色:

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

class CheckBoxDemo(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        # 创建复选框
        self.cb1 = QCheckBox('红色', self)
        self.cb1.move(20, 20)
        self.cb1.setCheckable(True)
        self.cb1.setStyleSheet('QCheckBox::indicator:checked{background-color:red;}')

        self.cb2 = QCheckBox('绿色', self)
        self.cb2.move(20, 50)
        self.cb2.setCheckable(True)
        self.cb2.setStyleSheet('QCheckBox::indicator:checked{background-color:green;}')

        self.cb3 = QCheckBox('蓝色', self)
        self.cb3.move(20, 80)
        self.cb3.setCheckable(True)
        self.cb3.setStyleSheet('QCheckBox::indicator:checked{background-color:blue;}')

        self.setGeometry(300, 300, 250, 150)
        self.setWindowTitle('复选框')
        self.show()

        # 为复选框的状态变化事件绑定槽函数
        self.cb1.stateChanged.connect(self.checkGroupBox)
        self.cb2.stateChanged.connect(self.checkGroupBox)
        self.cb3.stateChanged.connect(self.checkGroupBox)

    def checkGroupBox(self, state):
        # 获取被选中的复选框
        sender = self.sender()

        if sender.isChecked():
            # 设置窗口背景颜色为所选的复选框的背景颜色
            self.setStyleSheet('QWidget{background-color:%s;}' % sender.palette().button().color().name())
        else:
            # 恢复窗口背景颜色为默认色
            self.setStyleSheet('')

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = CheckBoxDemo()
    sys.exit(app.exec_())

示例2

如下代码中,我们创建了一个带有复选框的表格,并为复选框设置了背景颜色。

from PyQt5.QtWidgets import QApplication, QWidget, QTableView, QCheckBox, QAbstractItemView, QHeaderView, QVBoxLayout
from PyQt5.QtGui import QStandardItemModel, QColor
from PyQt5.QtCore import Qt
import sys

class TableViewDemo(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        # 创建表格模型
        self.model = QStandardItemModel()
        self.model.setHorizontalHeaderLabels(['序号', '姓名', '性别', '职业'])

        for row in range(3):
            item0 = QStandardItem(str(row+1))
            item1 = QStandardItem('name{}'.format(row+1))

            # 创建带有背景颜色的复选框
            item2 = QStandardItem('')
            item2.setCheckable(True)
            item2.setCheckState(Qt.Unchecked)
            item2.setBackground(QColor(255, 0, 0))
            item2.setTextAlignment(Qt.AlignCenter)

            item3 = QStandardItem('Job{}'.format(row+1))

            # 将一行数据添加到表格模型中
            self.model.appendRow([item0, item1, item2, item3])

        # 创建表格控件,并设置模型
        self.tableView = QTableView(self)
        self.tableView.setModel(self.model)
        self.tableView.setSelectionMode(QAbstractItemView.SingleSelection)
        self.tableView.setSelectionBehavior(QAbstractItemView.SelectRows)
        self.tableView.setColumnWidth(0, 60)
        self.tableView.setColumnWidth(1, 120)

        # 设置表格头
        self.tableView.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)

        # 垂直布局,将表格控件添加到布局中
        vbox = QVBoxLayout(self)
        vbox.addWidget(self.tableView)

        self.setGeometry(300, 300, 350, 150)
        self.setWindowTitle('表格控件')
        self.show()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = TableViewDemo()
    sys.exit(app.exec_())

上述代码中,我们创建了一个表格控件,并在其中添加了带有背景颜色的复选框。需要注意的是,我们是通过QStandardItem类创建了一个带有背景颜色的复选框,然后将前景色设置为白色,这样复选框看起来就像是有背景颜色一样了。同时,需要将复选框的文本对齐方式设置为AlignCenter。