2015-05-29 3 views
1

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

заголовочный файлFix QToolButton icon

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

Можете ли вы поделиться кодом, который вы используете для настройки QToolButton и QAction внутри? – alediaferia

+0

Возможно, вы можете переопределить значок кнопки с помощью специальной таблицы стилей? Возьмите это для вдохновения: http://stackoverflow.com/questions/20573944/change-icon-on-state-change-using-qt-stylesheet – ypnos

+0

@alediaferia Я предоставил код – tema

ответ

2

Итак, я вырыл зажженной TLE в QToolButton исходного кода here и, похоже, такое поведение зашито в том смысле, что QToolButton класса прослушивает сигнал действия triggered и обновляет действие на кнопку по умолчанию соответственно (QToolButton::setDefaultAction)

Вы, вероятно, можете подключиться к тому же сигналу и сбросьте значок QToolButton по своему желанию.

BTW это выглядит довольно разумно, учитывая, что ваши действия можно проверить и обернуть в QToolButton.

1

Да, это возможно, как alediaferia предложить, вы можете сохранить значок QToolButton первого и сбросить его снова:

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

PS: если вы хотите использовать свой код, не забудьте включить C++ 11 поддержка выражения lambda в вашем файле pro путем добавления CONFIG + = C++ 11