为自定义QT类应用不同的QSS样式表

时间:2018-12-10 13:16:12

标签: qt qt5 qtstylesheets

我正在为我的GUI使用qss样式表。它运作良好,但我想为我的自定义窗口小部件定义不同的样式表。 例如,QPushbutton的样式效果很好,但是我想为MyQPushButton应用不同的样式(从QPushButton扩展)。

我尝试过这样的事情:

MyQPushButton
{
    color: #dcdcdc;
    // some code here
}

QPushButton
{
    color: #b1b1b1;
    // some code here
}

但是QPushButton的样式已应用于MyQPushButton。 如何覆盖此行为?

2 个答案:

答案 0 :(得分:1)

如果要在项目中设置特定元素的样式,则可以像这样使用它;

QPushButton#MyQPushButton
{
    color: #dcdcdc;
    // some code here
}

我假设您已经将新的QPushButton对象命名为MyQPushButton,则可以这样命名元素;

QPushButton* myButton = new QPushButton;
myButton->setObjectName("MyQPushButton");

如果没有命名元素,则无法访问它以赋予其替代样式。

答案 1 :(得分:1)

奥赞(Ozan Yurtsever)的答案行之有效,但却是不明智的做法。
除非要在应用程序中设置非常独特的小部件样式,否则不应将对象名称用于样式表。容易出错,而且更冗长。

默认情况下,Qt样式表已经允许您想要的样式,您可以覆盖子类的样式(请参见this part of the doc的结尾)。
如文档中所述,样式表中声明的顺序很重要,因此您的样式表应为:

QPushButton
{
    color: #b1b1b1;
    // some code here
}
MyQPushButton
{
    color: #dcdcdc;
    // some code here
}

否则,QPushButton的样式将覆盖MyQPushButton的样式,因为MyQPushButton也是QPushButton

还可以将样式的范围仅限制为类,而不限于.QPushButton { /*some code*/ }的子类,请参见the doc about selectors

最后一个提示,我遇到样式表不适用于子类的问题,请检查您是否没有忘记子类中的Q_OBJECT宏。