【问题标题】:Apply different QSS stylesheet for custom QT class为自定义 QT 类应用不同的 QSS 样式表
【发布时间】:2019-05-11 09:38:22
【问题描述】:

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

我尝试过这样的事情:

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

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

但是QPushButton的样式已经应用在MyQPushButton上。 如何覆盖这种行为?

【问题讨论】:

标签: qt qt5 qtstylesheets


【解决方案1】:

如果你想为项目中的特定元素设置样式,可以这样使用;

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

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

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

如果不命名你的元素,你就不能访问它来给它一个覆盖的样式。

【讨论】:

  • 我不知道为什么这个答案被接受,但如果你想要连续多个按钮,它会失败
【解决方案2】:

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 宏。

【讨论】:

  • 由于未知原因,您的解决方案不起作用我在qss中的QPushButton东西之后添加了MyQPushButton,QObject宏存在......
  • 这个非常简单的代码适用于我(Qt 5.9,但我记得它也适用于 4.8):ui->verticalLayout->addWidget(new QPushButton("QPushButton")); ui->verticalLayout->addWidget(new MyQPushButton("MyQPushButton")); qApp->setStyleSheet("QPushButton { color: blue; } MyQPushButton { color: red; }"); 除了 Q_OBJECT 宏或您应用样式表的方式,我看不到什么可能会出错。您没有其他样式表规则可以覆盖这些规则吗?
  • 你可以检查这个有效的答案,并尝试看看你的情况有什么不同:stackoverflow.com/a/45572455/6165833
  • 覆盖默认样式的解决方案也是不好的做法
猜你喜欢
  • 2013-01-18
  • 1970-01-01
  • 2011-05-29
  • 2011-11-08
  • 1970-01-01
  • 2014-03-24
  • 2018-07-25
  • 1970-01-01
  • 2012-02-04
相关资源
最近更新 更多