Исправить значок QToolButton

Я имею QToolButton с парой QActionвнутри.
Проблема в том, что я установил значок для этой кнопки панели инструментов, и я не хочу, чтобы она менялась, когда я выбираю некоторые QAction (меняет заданный элемент на текст из выбранного QAction) из всплывающего меню.
Есть ли QT-способ получить то, что мне нужно?

заголовочный файл

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

2 ответа

Решение

Итак, я немного покопался в QToolButton Исходный код здесь, и похоже, что это поведение жестко закодировано в том смысле, что QToolButton класс прислушивается к действию triggered сигнализирует и обновляет действие кнопки по умолчанию соответственно ( 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: если вы хотите использовать мой код, не забудьте включить поддержку C++11 для лямбда-выражений в вашем pro-файле, добавив CONFIG += C++11

Другие вопросы по тегам