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

时间:2018-03-14 14:26:31

标签: python qt pyqt pyside qtstylesheets

假设我们QFormLayout objectName设置为"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)

现在,我想要使用外部QLabel文件更改QLineEditformLayout个/ .qss的样式。我希望这样的事情:

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

我的问题:

如何更改位于外部布局/窗口小部件(在示例QLabel)中的特定类型(在示例QLineEditformLayout中)的所有窗口小部件的样式.qss没有使用对象名称属性?

1 个答案:

答案 0 :(得分:2)

QLayout派生类不是QWidget派生的,这使得它们完全脱离了Qt样式系统。

解决问题的一种方法是使用窗口小部件支持每个布局,即不要让窗口小部件具有多个布局。这样,属于布局的所有窗口小部件(即标签)也是同一窗口小部件的子窗口,您可以在其中注入样式表:

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

因此,如果您有一个带有四个布局的小部件,您应该在其中放置四个子小部件并将每个布局放在其中一个小部件中(然后以与先前布置布局相同的方式布置小部件)。 / p>

另一种解决方法包括子类化小部件,并在样式表中按类型名称选择它们。例如,如果布局中有特殊标签,请使用最简单的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*/
}

这应该是有效的,但可能会变得乏味并且需要很多努力(也可能最终有很多类型,仅适用于样式表选择)。