布局中小部件的哪种样式 sheet 选择器?

Which style sheet selector for widgets in a layout?

假设我们有一个 QFormLayoutobjectName 设置为 "formLayout"。 此布局由两个 QLabelQLineEdit 和对象组成:

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 文件更改 formLayoutQLabel/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 中)的所有特定类型的小部件(例如 QLabelQLineEdit)的样式) 在外部 .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 的缘故)。