【问题标题】:Qt Style Sheet - Different styles for same type widgetsQt 样式表 - 相同类型小部件的不同样式
【发布时间】:2014-03-24 22:46:38
【问题描述】:

我需要为相同类型的小部件实例分配不同的样式。专门用于 QActions。以下样式表设置了 QActions 的背景图片,实际上是工具按钮。

QToolButton
{
    background-image: url(bg.png);
}

但我需要为这样的工具按钮分配不同的背景。

QToolButton::actClose
{
    background-image: url(close.png);
}
QToolButton::actOpen
{
    background-image: url(open.png);
}

有没有这样简单的方法或者不可能?

【问题讨论】:

    标签: qt qtstylesheets


    【解决方案1】:

    您可以为 QToolButton 的实例设置对象名称

    QToolButton *button = new QToolButton;
    button->setObjectName("firstButton");
    
    button = new QToolButton;
    button->setObjectName("secondButton");
    

    然后在样式表中使用它们

    QToolButton#firstButton 
    { 
       background-color: gray 
    }
    
    QToolButton#secondButton 
    { 
       background-color: red 
    }
    

    【讨论】:

    • 它不起作用,因为它不是一个工具按钮它是一个QAction
    • QAction 不是QWidget 的一种,因此您不能为其设置背景或图像(直接来自QObject)。 QToolButton 是一种QWidget,与它的某些操作相关联,因此可以有背景、图标等。
    【解决方案2】:

    如果您可以发布创建 QToolButton 并与 QActions 关联的 c++ 代码,这将很有帮助。

    引用 QToolBar 的参考“工具栏按钮是通过添加操作添加的,使用 addAction() 或 insertAction()。”和“QWidget * QToolBar widgetForAction (QAction *action)const 返回与指定操作关联的小部件。"

    因此,如果您正在创建 QToolBar 并调用 QToolBar::addAction(QAction*) 来填充它,则可以获得指向工具按钮的指针。试试QToolBar::widgetForAction(),调用setObjectName(""),就可以应用Blueman的方法了。

    在将样式表应用于widget时,“#”在类名后面指定对象名,“:”在objectName的className后面表示对象的状态,如“启用”,“::”用于指定诸如“ListView::Item”之类的子控件,不幸的是 QAction 不是 QToolBar 的。

    【讨论】: