布局中小部件的哪种样式 sheet 选择器?
Which style sheet selector for widgets in a layout?
假设我们有一个 QFormLayout
,objectName
设置为 "formLayout"
。
此布局由两个 QLabel
和 QLineEdit
和对象组成:
formLayout = QtGui.QFormLayout()
formLayout.setObjectName("formLayout")
label1 = QtGui.QLabel()
label2 = QtGui.QLabel()
lineEdit1 = QtGui.QLineEdit()
lineEdit2 = QtGui.QLineEdit()
formLayout.addRow(label1, lineEdit1)
formLayout.addRow(label2, lineEdit2)
现在我想用外部 .qss
文件更改 formLayout
中 QLabel
/QLineEdit
的样式。我希望是这样的:
QFormLayout#formLayout > QLabel, QLineEdit{
/*set some styles for QLabel/QLineEdit in the formLayout*/
}
不幸的是,这不起作用。我知道我可以将 formLayout
中的所有 QLabel
设置为相同的对象名称:
label1 = QtGui.setObjectName("formLayoutLabel")
label2 = QtGui.setObjectName("formLayoutLabel")
并像这样设置他们的样式:
QLabel#formLayoutLabel{
/*set some styles for QLabel in the formLayout*/
}
我的问题:
如何更改位于父 layout/widget(例如 formLayout
中)的所有特定类型的小部件(例如 QLabel
和 QLineEdit
)的样式) 在外部 .qss
中而不使用对象名称 属性?
QLayout
派生的 类 不是 QWidget
派生的,这使它们完全脱离了 Qt 样式系统。
解决这个问题的一种方法是用一个小部件支持每个布局,即不要让一个小部件有多个布局。这样,属于布局的所有小部件(即标签)也是同一小部件的子级,您可以在其中注入样式表:
QLabel {
/*set some styles for QLabel in the formLayout*/
}
因此,如果您有一个小部件,比方说,有四个布局,您应该将四个子小部件放入其中,并将每个布局放入其中一个(然后按照您之前布置布局的方式布置小部件) .
另一种解决方法包括对小部件进行子类化,并在样式表中按类型名称 select 它们。例如,如果布局中有 special 标签,请使用最简单的 QLabel
子类:
class Layout1Label(QtGui.QLabel):
def __init__(self, parent=None):
super(Layout1Label, self).__init__(parent)
然后只将该类型的标签添加到布局中:
label = Layout1Label()
layout.addWidget(label)
并在样式表中引用它们:
Layout1Label {
/*set some styles for all labels in layout*/
}
这应该是有效的,但可能会变得乏味并且需要付出很多努力(而且您最终可能会得到很多类型,只是为了样式表 selection 的缘故)。
假设我们有一个 QFormLayout
,objectName
设置为 "formLayout"
。
此布局由两个 QLabel
和 QLineEdit
和对象组成:
formLayout = QtGui.QFormLayout()
formLayout.setObjectName("formLayout")
label1 = QtGui.QLabel()
label2 = QtGui.QLabel()
lineEdit1 = QtGui.QLineEdit()
lineEdit2 = QtGui.QLineEdit()
formLayout.addRow(label1, lineEdit1)
formLayout.addRow(label2, lineEdit2)
现在我想用外部 .qss
文件更改 formLayout
中 QLabel
/QLineEdit
的样式。我希望是这样的:
QFormLayout#formLayout > QLabel, QLineEdit{
/*set some styles for QLabel/QLineEdit in the formLayout*/
}
不幸的是,这不起作用。我知道我可以将 formLayout
中的所有 QLabel
设置为相同的对象名称:
label1 = QtGui.setObjectName("formLayoutLabel")
label2 = QtGui.setObjectName("formLayoutLabel")
并像这样设置他们的样式:
QLabel#formLayoutLabel{
/*set some styles for QLabel in the formLayout*/
}
我的问题:
如何更改位于父 layout/widget(例如 formLayout
中)的所有特定类型的小部件(例如 QLabel
和 QLineEdit
)的样式) 在外部 .qss
中而不使用对象名称 属性?
QLayout
派生的 类 不是 QWidget
派生的,这使它们完全脱离了 Qt 样式系统。
解决这个问题的一种方法是用一个小部件支持每个布局,即不要让一个小部件有多个布局。这样,属于布局的所有小部件(即标签)也是同一小部件的子级,您可以在其中注入样式表:
QLabel {
/*set some styles for QLabel in the formLayout*/
}
因此,如果您有一个小部件,比方说,有四个布局,您应该将四个子小部件放入其中,并将每个布局放入其中一个(然后按照您之前布置布局的方式布置小部件) .
另一种解决方法包括对小部件进行子类化,并在样式表中按类型名称 select 它们。例如,如果布局中有 special 标签,请使用最简单的 QLabel
子类:
class Layout1Label(QtGui.QLabel):
def __init__(self, parent=None):
super(Layout1Label, self).__init__(parent)
然后只将该类型的标签添加到布局中:
label = Layout1Label()
layout.addWidget(label)
并在样式表中引用它们:
Layout1Label {
/*set some styles for all labels in layout*/
}
这应该是有效的,但可能会变得乏味并且需要付出很多努力(而且您最终可能会得到很多类型,只是为了样式表 selection 的缘故)。