QAction
配合 QMenu 使用
可以通过 AddAction
加入 QMenu
auto action = new QAction("Test");action->setCheckable(true);auto menu = new QMenu(this);menu->addAction(action);setContextMenuPolicy(Qt::CustomContextMenu);connect(this, &MainWindow::customContextMenuRequested, this,[=](const QPoint &pos){auto globalPos = this->mapToGlobal(pos);menu->exec(globalPos);});connect(action, &QAction::toggled, this, [](){qDebug() << "Test Action toggled";});connect(action, &QAction::triggered, this, [](){qDebug() << "Test Action triggered";});
QAction::toggled
信号只有当QActio::isChecked()状态变化时才会触发。
单个 QAction
对应多个控件
如下所示,菜单栏,右键菜单以及 QToolButton
共同使用同一个 action
,在需要多个按钮相同功能时,并且需要状态同步时,可以使用 QAction
统一管理
auto action = new QAction("Test");action->setCheckable(true);auto menu = new QMenu(this);menu->addAction(action);ui->menu->addAction(action);ui->toolButton->setDefaultAction(action);setContextMenuPolicy(Qt::CustomContextMenu);connect(this, &MainWindow::customContextMenuRequested, this,[=](const QPoint &pos){auto globalPos = this->mapToGlobal(pos);menu->exec(globalPos);});connect(action, &QAction::toggled, this, [](){qDebug() << "Test Action";});
- isChecked()、 isVisible(), 以及 isEnabled() 状态会自动同步
- setText、setIconText,会自动更新到按钮上。
注意
QAction并不是一个QWidget
menu->addAction(action);
, 会将menu
,加入associatedObjects
中。QToolBar::addAction
, 会创建一个QToolButton
, 加入associatedObjects
中,由QToolButton负责实际显示样式,QAction
主要负责显示状态的同步,以及触发动作等。- Qt6 之前可以使用
associatedWidgets