首页 > 解决方案 > 选中/取消选中时如何更改 QToolBar 上的 QAction 图标?

问题描述

我创建了一个QToolBar

QToolBar* pQToolbar = new QToolBar();
QAction* pAction = pQToolbar->addAction("CoordinateType");
pAction->setObjectName("CoordinateType");
pAction->setIcon(QIcon("global.png"));
pAction->setCheckable(true);

然后我在样式表中检查时尝试设置图标:

#CoordinateType {
    image: url(global.png);
}

#CoordinateType:checked {
    image: url(local.png);
}

但它不起作用。

那么当工具按钮被选中时,我应该怎么做才能改变图标呢?

标签: c++qtqt5qtstylesheetsqtoolbar

解决方案


原因

您的方法存在几个问题:

  1. 您设置操作的对象名称。动作本身是不可样式化的。它被分配给一个按钮,并且它的名称不会传递给这个按钮(因为一个按钮可能有几个分配给它的动作)。因此,您的选择器#CoordinateType将不起作用,您将无法定位此特定按钮。

  2. 无法使用image属性设置QToolButton的图标,因为样式表引用指出:

在子控件的内容矩形中绘制的图像。

如果要在按钮上设置图像,请background-image改用。将以下 qss 设置为全局样式表在某种程度上是可行的,但同样难以定位QToolBar的特定按钮:

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

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

解决方案

考虑到上述问题,我的解决方案是使用QIcon::State而不是样式表。

例子

以下是如何更改代码以实现此目的的示例:

  1. 创建一个图标并设置它

    QIcon icon;
    
    icon.addPixmap(QPixmap("global.png"), QIcon::Normal, QIcon::Off);
    icon.addPixmap(QPixmap("local.png"), QIcon::Normal, QIcon::On);
    
  2. 将图标设置为pAction的图标

    pAction->setIcon(icon);
    

注意:有可能,您也必须考虑其他模式


推荐阅读