如何在 checked/unchecked 时更改 QToolBar 上 QAction 的图标?

How to change the icon of a QAction on a QToolBar when checked/unchecked?

我创建了一个 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);
}

但是没用。

那么勾选工具按钮后图标应该怎么改呢?

原因

你的方法有几个问题:

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

  2. 无法使用 image 属性 设置 QToolButton 的图标,正如 stylesheet reference 所述:

The image that is drawn in the contents rectangle of a subcontrol.

如果要在按钮上设置图像,请改用 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);
    

注:有可能,你还得考虑另一个modes