我必须编辑 QColorDialog 小部件内部组件的样式表
I have to edit the stylesheet of the QColorDialog widget internal components
我可以通过下面给出的 sheet 代码
来设置 QColorDialog 子项的样式 sheet,例如旋转框、标签和按钮
QColorDialog QPushButton
{
border : 2px solid black;
background : green;
}
但我无法设置每个内部组件的样式sheet,我在文档中进行了搜索,但没有给出样式颜色对话框的描述,尽管对于像 QCalendarWidget 这样的小部件,我们使用 QCalendarWidget QWidget#qt_calendar_navigationbar 设置日历工具栏的样式,我认为每个组件都应该有特定的名称
虽然 一些 复杂的小部件具有带有对象名称 属性 集的子小部件(如在 QCalendarWidget 中),但并不是所有 Qt 对象都必须具有对象名称;我相信开发人员只会在出于某种原因需要时为特定的子部件设置这些名称。
查看 source code of QColorDialog,没有设置对象名称的小部件,因此您只能使用 findChild
或 findChildren
访问它们并单独设置样式表 或 手动设置它们的对象名称。
请注意,QColorDialog 是“私下”创建的,无法直接访问其小部件,并且其结构在不同版本的 Qt 中可能有所不同。
还要考虑该对话框中的以下小部件是私有的并且不是标准小部件(因此您无法以任何方式访问它们):
- 标准色table
- 自定义颜色列表
- 颜色选择器
- 颜色预览
唯一的“常量”可能是旋转框、html 颜色 QLineEdit 和对话框按钮框(显然假设您没有设置 NoButtons
选项)。
假设旋转框总是以相同的顺序创建(但是,请记住,您不能想当然地认为这是理所当然的!),您可以浏览布局,为它们设置对象名称,然后使用以下方法设置整个对话框的样式#
选择器,可用于根据对象名称设置特定小部件的样式。您也可以改用 dialog.findChildren(QtWidgets.QSpinBox)
。
在下面的代码中,我将“确定”按钮设为绿色,将“取消”按钮设为红色,我还设置了每个旋转框的背景和 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_())
我可以通过下面给出的 sheet 代码
来设置 QColorDialog 子项的样式 sheet,例如旋转框、标签和按钮QColorDialog QPushButton
{
border : 2px solid black;
background : green;
}
但我无法设置每个内部组件的样式sheet,我在文档中进行了搜索,但没有给出样式颜色对话框的描述,尽管对于像 QCalendarWidget 这样的小部件,我们使用 QCalendarWidget QWidget#qt_calendar_navigationbar 设置日历工具栏的样式,我认为每个组件都应该有特定的名称
虽然 一些 复杂的小部件具有带有对象名称 属性 集的子小部件(如在 QCalendarWidget 中),但并不是所有 Qt 对象都必须具有对象名称;我相信开发人员只会在出于某种原因需要时为特定的子部件设置这些名称。
查看 source code of QColorDialog,没有设置对象名称的小部件,因此您只能使用 findChild
或 findChildren
访问它们并单独设置样式表 或 手动设置它们的对象名称。
请注意,QColorDialog 是“私下”创建的,无法直接访问其小部件,并且其结构在不同版本的 Qt 中可能有所不同。
还要考虑该对话框中的以下小部件是私有的并且不是标准小部件(因此您无法以任何方式访问它们):
- 标准色table
- 自定义颜色列表
- 颜色选择器
- 颜色预览
唯一的“常量”可能是旋转框、html 颜色 QLineEdit 和对话框按钮框(显然假设您没有设置 NoButtons
选项)。
假设旋转框总是以相同的顺序创建(但是,请记住,您不能想当然地认为这是理所当然的!),您可以浏览布局,为它们设置对象名称,然后使用以下方法设置整个对话框的样式#
选择器,可用于根据对象名称设置特定小部件的样式。您也可以改用 dialog.findChildren(QtWidgets.QSpinBox)
。
在下面的代码中,我将“确定”按钮设为绿色,将“取消”按钮设为红色,我还设置了每个旋转框的背景和 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_())