当使用QToolButton和setDefaultAction(myAction)
方法时,它将获得默认的动作属性
如果一个工具按钮有一个默认的动作,这个动作定义了按钮的动作文本、图标、工具提示等属性
所以我尝试覆盖图标,调用QToolButton上的setIcon。
myAction.setIcon(...);
myToolButton->setDefaultAction(myAction);
myToolButton->setIcon(...);
但myToolButton
仍有myAction
的图标
是否有一种方法来保持默认的动作,但覆盖它的图标,仅为QToolButton,而不是为动作本身?换句话说:QToolButtons如何拥有与其默认操作不同的属性?
如果您查看QToolButton::setDefaultAction(QAction* action)
的源代码,它使用setIcon(action->icon())
从您给它的操作设置图标。你可以在调用setDefaultAction
之后用你想要的单独的图标调用setIcon
来手动覆盖那个图标。
这里有一个快速的例子,你可以尝试一下。也许你可以将它与你目前正在做的事情进行比较,或者发布一个你自己的例子?
MainWindow.cpp
#include "MainWindow.hpp"
#include <QAction>
#include <QToolButton>
MainWindow::MainWindow(QWidget* parent) :
QMainWindow(parent) {
QAction* action = new QAction(QIcon(QStringLiteral("original.jpg")), QStringLiteral("Test Action"), this);
QToolButton* toolButton = new QToolButton(this);
toolButton->setDefaultAction(action);
toolButton->setIcon(QIcon(QStringLiteral("new.jpg")));
}
MainWindow.hpp
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QWidget>
class MainWindow : public QMainWindow {
Q_OBJECT
public:
explicit MainWindow(QWidget* parent = nullptr);
};
#endif // MAINWINDOW_H
main.cpp
#include "MainWindow.hpp"
#include <QApplication>
int main(int argc, char* argv[]) {
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
当动作改变时,QToolButton图标将重置为动作图标。
我们需要像这样重写代码;
connect(toolButton, &QAction::changed, [=](){
toolButton->setIcon(QIcon(QStringLiteral("new.jpg")));
});