布局中小部件的样式表选择器?



假设我们有一个objectName设置为"formLayout"QFormLayout。 此布局由两个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's/QLineEdit的样式。我期待这样的事情:

QFormLayout#formLayout > QLabel, QLineEdit{
/*set some styles for QLabel/QLineEdit in the formLayout*/
}

不幸的是,这不起作用。我知道我可以将所有QLabelformLayout设置为相同的对象名称:

label1 = QtGui.setObjectName("formLayoutLabel")    
label2 = QtGui.setObjectName("formLayoutLabel")

并像这样设置他们的风格:

QLabel#formLayoutLabel{
/*set some styles for QLabel in the formLayout*/
}

我的问题:

如何在不使用对象名称属性的情况下更改位于外部.qss内父布局/小部件(示例formLayout)中特定类型的所有小部件(例如QLabelQLineEdit)的样式?

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*/
}

这应该是有效的,但可能会变得乏味并且需要付出很多努力(你最终可能会得到很多类型,只是为了样式表选择)。

最新更新