【发布时间】:2018-03-14 14:26:31
【问题描述】:
假设我们有一个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's/QLineEdit's 的样式。我希望是这样的:
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*/
}
我的问题:
如何在不使用对象的情况下更改位于外部 .qss 中的父布局/小部件(例如 formLayout)中特定类型的所有小部件(例如 QLabel 和 QLineEdit)的样式命名属性?
【问题讨论】:
-
所有布局必须有一个父级,并且该布局内的所有小部件都将自动重新设置为其父级。因此,只需为布局的父级指定一个对象名称,然后在您的全局样式表中您可以使用
#formParent QLabel { ... }等。有关其他选项,请参阅:Stylesheet Selector Types。 -
在我的例子中,层次结构看起来像这样:
QDialog -> QVBoxLayout-> QHBoxLayout -> QFormLayout。所以所有布局的父级是QDialog对吗?为了只修改表单布局的组件,我必须为其添加一个容器小部件,这将导致:QDialog -> QVBoxLayout-> QHBoxLayout -> QWidget -> QFormLayout。我已经对此进行了测试,并且可以正常工作。这是最好的解决方案,还是没有“帮助容器小部件”我可以做得更好。 -
另一个问题:这种方法是最佳实践吗?或者它们是否应该与上面示例中提到的对象名称相同。基本上:通过相同的父对象与相同的对象名称修改 QWidgets 的样式?
-
我认为没有任何一种“最佳”解决方案。您只需要选择最适合您当前正在开发的应用程序上下文的一个即可。
标签: python qt pyqt pyside qtstylesheets