我必须编辑 QColorDialog 小部件内部组件的样式表

Posted

技术标签:

【中文标题】我必须编辑 QColorDialog 小部件内部组件的样式表【英文标题】:I have to edit the stylesheet of the QColorDialog widget internal components 【发布时间】:2020-06-23 20:46:30 【问题描述】:

我可以通过下面给出的样式表代码设置 QColorDialog 子项的样式表,例如旋转框、标签和按钮

QColorDialog QPushButton 

border : 2px solid black;
background : green;

但我无法设置每个内部组件的样式表,我在文档中进行了搜索,但没有对样式颜色对话框进行描述,尽管对于像 QCalendarWidget 这样的小部件,我们使用了 QCalendarWidget QWidget#qt_calendar_navigationbar为了设置日历工具栏的样式,我认为每个组件都应该有特定的名称

【问题讨论】:

你的问题有点不清楚。是否要设置 any 子窗口小部件的边框和背景? 是的,但是我想为每个孩子分别设置样式表,例如“确定”和“取消”按钮应该有不同的样式表。 【参考方案1】:

虽然一些复杂的小部件具有带有对象名称属性集的子小部件(如在 QCalendarWidget 中),但并非所有 Qt 对象都必须有对象名称;我相信开发人员只会在出于某种原因需要时为特定的子小部件设置这些名称。

查看source code of QColorDialog,没有设置对象名称的小部件,因此您只能使用findChildfindChildren 访问它们并单独设置样式表手动设置它们的对象名称。

请注意,QColorDialog 是“私有”创建的,无法直接访问其小部件,并且其结构在不同版本的 Qt 中可能有所不同。 还要考虑该对话框中的以下小部件是私有的,不是标准小部件(因此您无法以任何方式访问它们):

标准色表 自定义颜色列表 颜色选择器 颜色预览

唯一的“常量”可能是旋转框、html 颜色 QLineEdit 和对话框按钮框(显然,假设您没有设置 NoButtons 选项)。

假设旋转框始终以相同的顺序创建(但请记住,您不能想当然地这样做!),您可以浏览布局,为它们设置对象名称,然后使用 @ 设置整个对话框的样式987654327@ 选择器,可用于根据其对象名称设置特定小部件的样式。你也可以改用dialog.findChildren(QtWidgets.QSpinBox)

在下面的代码中,我将 Ok 按钮设置为绿色,将 Cancel 按钮设置为红色,并且我还设置了每个 spinbox 的背景和 HTML 颜色行编辑:

from PyQt5 import QtWidgets
import sys

app = QtWidgets.QApplication(sys.argv)
dialog = QtWidgets.QColorDialog()
dialog.setOption(dialog.ShowAlphaChannel)

grid = dialog.findChild(QtWidgets.QGridLayout)
names = iter(('hue', 'sat', 'val', 'red', 'green', 'blue', 'alpha'))
for i in range(grid.count()):
    item = grid.itemAt(i)
    widget = item.widget()
    if isinstance(widget, QtWidgets.QSpinBox):
        widget.setObjectName(next(names))

# alternatively:
#spins = dialog.findChildren(QtWidgets.QSpinBox)
#names = 'hue', 'sat', 'val', 'red', 'green', 'blue', 'alpha'
#for name, spin in zip(names, spins):
#    spin.setObjectName(name)

buttonBox = dialog.findChild(QtWidgets.QDialogButtonBox)
buttonBox.button(buttonBox.Ok).setObjectName('ok')
buttonBox.button(buttonBox.Cancel).setObjectName('cancel')

dialog.setStyleSheet('''
    /* the HTML color line edit */
    QLineEdit 
        background: yellow;
    

    /* the spin boxes */
    QSpinBox#hue 
        background: coral;
    
    QSpinBox#sat 
        background: orange;
    
    QSpinBox#val 
        background: lightgray;
    
    QSpinBox#red 
        background: orangered;
    
    QSpinBox#green 
        background: lime;
    
    QSpinBox#blue 
        background: aqua;
    
    QSpinBox#alpha 
        background: pink;
    

    /* buttons that are children of QDialogButtonBox */
    QDialogButtonBox QAbstractButton#ok 
        background: green;
    
    QDialogButtonBox QAbstractButton#cancel 
        background: red;
    
    ''')

dialog.show()
sys.exit(app.exec_())

【讨论】:

以上是关于我必须编辑 QColorDialog 小部件内部组件的样式表的主要内容,如果未能解决你的问题,请参考以下文章

如何在小部件中显示来自 QColorDialog 的 QColor?

Qt 颜色选择器小部件?

Flutter - setState 不更新内部有状态小部件

如何拖放自定义小部件?

在 Qt 中的小部件内部绘画

添加应用组权利