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

Python 布局中小部件的哪个样式表选择器?,python,qt,pyqt,pyside,qtstylesheets,Python,Qt,Pyqt,Pyside,Qtstylesheets,我们有一个QFormLayout,其中objectName设置为“formLayout”。 此布局由两个QLabel和QLineEdit和对象组成: formLayout = QtGui.QFormLayout() formLayout.setObjectName("formLayout") label1 = QtGui.QLabel() label2 = QtGui.QLabel() lineEdit1 = QtGui.QLineEdit() lineEdit2 = QtGui.Q

我们有一个
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*/
}
QLabel#formLayoutLabel{
    /*set some styles for QLabel in the formLayout*/
}
不幸的是,这不起作用。我知道我可以将
formLayout
中的所有
QLabel
设置为相同的对象名称:

label1 = QtGui.setObjectName("formLayoutLabel")    
label2 = QtGui.setObjectName("formLayoutLabel")
并将他们的风格设置为:

QFormLayout#formLayout > QLabel, QLineEdit{
    /*set some styles for QLabel/QLineEdit in the formLayout*/
}
QLabel#formLayoutLabel{
    /*set some styles for QLabel in the formLayout*/
}
我的问题:


如何更改外部
中父布局/小部件(例如
formLayout
)中特定类型的所有小部件(例如
QLabel
QLineEdit
)的样式。qss
不使用对象名属性?

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

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

QLabel {
    /*set some styles for QLabel in the formLayout*/
}
Layout1Label {
    /*set some styles for all labels in layout*/
}
因此,如果您有一个小部件,比如说,有四个布局,那么您应该在其中放置四个子小部件,并将每个布局放在其中一个小部件中(然后以与之前布局相同的方式布置小部件)

另一种解决方法是对小部件进行子类化,并在样式表中按类型名称选择它们。例如,如果布局中有特殊标签,请使用最简单的
QLabel
子类:

class Layout1Label(QtGui.QLabel):

    def __init__(self, parent=None):
        super(Layout1Label, self).__init__(parent)
然后仅将该类型的标签添加到布局中:

label = Layout1Label()
layout.addWidget(label)
并在样式表中引用它们:

QLabel {
    /*set some styles for QLabel in the formLayout*/
}
Layout1Label {
    /*set some styles for all labels in layout*/
}

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

一个小部件不可能有多个布局。同样,所有布局都必须有一个父级(否则它们包含的小部件将不会被布局输出)。布局中的任何小部件都将自动重新租给布局设置的任何小部件。因此,布局(及其子布局)中的所有小部件将形成一个自然的层次结构。如果这不是真的。嵌套布局不可能工作,级联样式表也是如此。也就是说,一个小部件不可能属于多个布局。对不起,这一定是文字问题。我的意思是一个小部件可以包含多个布局,而不是小部件自己的布局。在布局中使用子/父关系术语也可能会产生误导,因为它们不是Qwidget子类。所有布局类继承QObject,所有小部件子类也继承QObject。因此,他们最强调的是形成子女/父母关系。正如我上面所说的,如果不是这样,布局和QS就不可能工作。对象层次结构是绝对必要的:这就是为什么布局中的所有小部件都会自动重新分配。这在样式上下文中是误导性的:是的,有父对象和子对象,但其中一些参与样式层次结构(小部件),而另一些不参与样式层次结构(布局)。所有布局都必须有父对象,布局中的所有小部件都将自动重新租给其父级。因此,只需给布局的父级一个对象名,然后在全局样式表中可以执行
#formParent QLabel{…}
等操作。请参阅:获取其他选项。在我的例子中,hirachy如下所示:
QDialog->QVBoxLayout->QHBoxLayout->QFormLayout
。所以所有布局的父级都是
QDialog
对吗?为了只修改formlayout的组件,我必须为它添加一个容器小部件,这将导致:
QDialog->QVBoxLayout->QHBoxLayout->QWidget->QFormLayout
。我已经测试了这个,它是有效的。这是最好的解决方案还是我可以不用“助手容器小部件”做得更好。另一个问题:这种方法是最佳实践吗?或者它们应该与上面示例中提到的对象名相同。基本上:修改QWidgets的样式是通过相同的父对象名还是相同的对象名?我认为没有任何一个“最佳”解决方案。您只需要选择在当前开发的应用程序上下文中最合适的一个。