修复 QToolButton 图标

Fix QToolButton icon

我有 QToolButton,里面有几个 QAction
问题是我已经为这个工具栏按钮设置了一个图标,但我不希望它在我选择一些 QAction 时改变(它将设置项更改为所选的文本QAction) 从弹出菜单。
有什么qt-way可以得到我需要的吗?

头文件

#include <QToolButton>

class FieldButton : public QToolButton
{
    Q_OBJECT
public:
    explicit FieldButton(QWidget *parent = 0);
};



cpp文件

 #include "fieldbutton.h"

FieldButton::FieldButton(QWidget *parent) :
    QToolButton(parent)
{
    setPopupMode(QToolButton::MenuButtonPopup);
    QObject::connect(this, SIGNAL(triggered(QAction*)),
                     this, SLOT(setDefaultAction(QAction*)));
}


我是这样使用的:

FieldButton *fieldButton = new FieldButton();
QMenu *allFields = new QMenu();
// ...  filling QMenu with all needed fields of QAction type like:
QAction *field = new QAction(tr("%1").arg(*h),0);
field->setCheckable(true);
allFields->addAction(field);
// ...
fieldButton->setMenu(allFields);
fieldButton->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
fieldButton->setIcon(QIcon(":/field.png"));
fieldButton->setText("My text");
fieldButton->setCheckable(true);
toolbar->addWidget(fieldButton);

所以,我在 QToolButton 源代码中挖掘了一点 here and it looks like this behavior is hardcoded in the sense that the QToolButton class listens for the action triggered signal and updates the button default action accordingly (QToolButton::setDefaultAction)

您可能可以连接到相同的信号并根据您的意愿重置 QToolButton 图标。

顺便说一句,这看起来是一个相当明智的行为,因为您的操作是可检查的并且包含在 QToolButton 中。

是的,按照 alediaferia 的建议,您可以先保存 QToolButton 图标,然后重新设置它:

 QObject::connect(this, &QToolButton::triggered, [this](QAction *triggeredAction) {
        QIcon icon = this->icon();
        this->setDefaultAction(triggeredAction);
        this->setIcon(icon);
 });

PS:如果您想使用我的代码,请不要忘记通过添加 CONFIG += c++11

在您的 pro 文件中启用对 lambda 表达式的 c++11 支持