1

我里面QToolButton有几个QAction
问题是我已经为这个工具栏按钮设置了一个图标,我不希望它改变,当我从弹出菜单中 选择一些QAction(它将设置项目从 selected 更改为文本)时。有什么方法可以得到我需要的东西吗? 头文件QAction


#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);
4

2 回答 2

2

所以,我在这里挖了一点QToolButton源代码,看起来这种行为是硬编码的,因为类监听动作信号并相应地更新按钮默认动作(QToolButton::setDefaultActionQToolButtontriggered

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

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

于 2015-05-29T10:19:28.417 回答
1

是的,正如 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 文件中启用 c++11 对 lambda 表达式的支持

于 2015-05-29T20:03:03.327 回答