假设我们有一个objectName
设置为"formLayout"
的QFormLayout
。 此布局由两个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
's/QLineEdit
的样式。我期待这样的事情:
QFormLayout#formLayout > QLabel, QLineEdit{
/*set some styles for QLabel/QLineEdit in the formLayout*/
}
不幸的是,这不起作用。我知道我可以将所有QLabel
formLayout
设置为相同的对象名称:
label1 = QtGui.setObjectName("formLayoutLabel")
label2 = QtGui.setObjectName("formLayoutLabel")
并像这样设置他们的风格:
QLabel#formLayoutLabel{
/*set some styles for QLabel in the formLayout*/
}
我的问题:
如何在不使用对象名称属性的情况下更改位于外部.qss
内父布局/小部件(示例formLayout
)中特定类型的所有小部件(例如QLabel
和QLineEdit
)的样式?
QLayout
派生类不是QWidget
派生的,这使得它们完全不在Qt样式系统之外。
解决此问题的一种方法是使用小部件支持每个布局,即不要让一个小部件具有多个布局。这样,属于布局的所有小部件(即标签)也是同一小部件的子项,您可以在其中注入样式表:
QLabel {
/*set some styles for QLabel in the formLayout*/
}
因此,如果你有一个有四个布局的小部件,你应该在其中放置四个子小部件,并将每个布局放在其中一个中(然后按照你之前排列布局的方式布置小部件)。
另一种解决方法包括对小部件进行子类化,并在样式表中按类型名称选择它们。例如,如果布局中有特殊标签,请使用最简单的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*/
}
这应该是有效的,但可能会变得乏味并且需要付出很多努力(你最终可能会得到很多类型,只是为了样式表选择)。