PyQT5 复选框更改指示器和刻度颜色

Posted

技术标签:

【中文标题】PyQT5 复选框更改指示器和刻度颜色【英文标题】:PyQT5 Checkbox changing indicator and tick colour 【发布时间】:2021-12-19 23:40:21 【问题描述】:

我需要在黑色背景下使用 QT Designer 来设计 UI。 我的源代码是用 python 编写的,使用 PyQT5(用 python3 执行)

现在我在使用 QCheckbox 时遇到了困难,其中框颜色遵循 QCheckbox 的背景颜色。所以我在样式表中将框颜色更改为白色。 但是,当框为白色时,勾号无法看到我认为哪个勾号也变为白色。我试图找到无论如何都可以将刻度颜色更改为黑色但无法更改的方法。

有人遇到过这个问题吗? 我的来源如下:

########################
#   Import             #
########################
import sys
from PyQt5.QtGui import QIcon
from PyQt5 import QtCore, QtGui, QtWidgets
from main_ui import Ui_MainWindow as QT_Main
import os
os.environ['DISPLAY'] = ':0'

class MainWindow(QtWidgets.QMainWindow):

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

        self.ui = QT_Main()
        self.ui.setupUi(self)
        self.showMaximized()

        self.ui.checkBox.setStyleSheet("QCheckBox::indicatorcolor:black;background-color:white;"
                                       "QCheckBoxcolor:white")

if __name__ == '__main__':
    try:
        app = QtWidgets.QApplication.instance()
        if app is None:
            app = QtWidgets.QApplication(sys.argv)
        else:
            print('QApplication instance already exists: %s' % str(app))
        window = MainWindow()
        window.show()
        app.exec_()
        sys.exit(app.exec_())

    except Exception as e:
        expstr = str(getattr(e, 'message', str(e)))

python中的PyQt5 UI文件如下:

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'main_ui.ui'
#
# Created by: PyQt5 UI code generator 5.13.0
#
# WARNING! All changes made in this file will be lost!


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(1005, 800)
        MainWindow.setStyleSheet("background-color: rgb(38, 38, 38);")
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget)
        self.verticalLayout.setObjectName("verticalLayout")
        self.frame_2 = QtWidgets.QFrame(self.centralwidget)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.frame_2.sizePolicy().hasHeightForWidth())
        self.frame_2.setSizePolicy(sizePolicy)
        self.frame_2.setStyleSheet("background-color: rgb(89, 89, 89);")
        self.frame_2.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.frame_2.setFrameShadow(QtWidgets.QFrame.Raised)
        self.frame_2.setObjectName("frame_2")
        self.horizontalLayout = QtWidgets.QHBoxLayout(self.frame_2)
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.frame_3 = QtWidgets.QFrame(self.frame_2)
        self.frame_3.setStyleSheet("background-color: rgb(98, 98, 98);")
        self.frame_3.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.frame_3.setFrameShadow(QtWidgets.QFrame.Raised)
        self.frame_3.setObjectName("frame_3")
        self.horizontalLayout.addWidget(self.frame_3)
        self.checkBox = QtWidgets.QCheckBox(self.frame_2)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.checkBox.sizePolicy().hasHeightForWidth())
        self.checkBox.setSizePolicy(sizePolicy)
        self.checkBox.setMinimumSize(QtCore.QSize(100, 20))
        self.checkBox.setStyleSheet("")
        self.checkBox.setObjectName("checkBox")
        self.horizontalLayout.addWidget(self.checkBox)
        self.verticalLayout.addWidget(self.frame_2)
        self.frame = QtWidgets.QFrame(self.centralwidget)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.frame.sizePolicy().hasHeightForWidth())
        self.frame.setSizePolicy(sizePolicy)
        self.frame.setMinimumSize(QtCore.QSize(0, 300))
        self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.frame.setFrameShadow(QtWidgets.QFrame.Raised)
        self.frame.setObjectName("frame")
        self.gridLayout = QtWidgets.QGridLayout(self.frame)
        self.gridLayout.setObjectName("gridLayout")
        self.tableView = QtWidgets.QTableView(self.frame)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.tableView.sizePolicy().hasHeightForWidth())
        self.tableView.setSizePolicy(sizePolicy)
        self.tableView.setMinimumSize(QtCore.QSize(0, 500))
        self.tableView.setObjectName("tableView")
        self.gridLayout.addWidget(self.tableView, 0, 0, 1, 1)
        self.verticalLayout.addWidget(self.frame)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 1005, 21))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.checkBox.setText(_translate("MainWindow", "CheckBox"))

【问题讨论】:

“选中”符号不遵循 QSS 样式颜色,因为它完全由当前样式绘制。如果要使用自定义颜色,则需要使用 QProxyStyle 或子类 QCheckBox 并覆盖其 paintEvent()。或者,使用Customizing QCheckBox 中解释的自定义图像/图标。顺便说一句,为了将来参考,请尝试更多努力提供minimal reproducible example:您的示例不需要 UI 或 pyuic 文件,只需创建一个基本小部件,设置布局并添加所需的小部件。 @musicamante 嗨,终于可以做到了。非常感谢您的指导。我将白色矩形图像加载到复选框中。注意到您的建议。非常感谢,祝您有愉快的一天。 【参考方案1】:

要克服 QCheckbox 的黑色背景问题,可以简单地在样式表中加载白色图像。

我的示例代码如下

self.ui.checkBox.setStyleSheet("QCheckBox::indicator"
                                       ""
                                       "background-image:   url(/home/pi/System/test/white.png);"
                                       "width:40px;"
                                       "height:40px;"
                                       "")

【讨论】:

以上是关于PyQT5 复选框更改指示器和刻度颜色的主要内容,如果未能解决你的问题,请参考以下文章

如何更改新的 TabLayout 指示器颜色和高度

角材料更改垫复选框内的刻度颜色

如何更改当前光标位置指示器的颜色?

更改 QCheckBox 指示器矩形颜色

如何更改 viewpager 中每个片段的点指示器(活动和非活动)的颜色?

更改 UIPickerView 选择指示器的颜色