QAction的使用
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,会自动更新到按钮上。
扩展
action->setText("&Test");
其中的 &
符号具有特殊含义,它用于定义该元素的键盘快捷键,如上述代码快捷键为 T
或者通过 alt + T
的方式触发
测试时,快捷键仅对 QMenu
中的选项有效,需要注意不能重复
注意
QAction并不是一个QWidget
menu->addAction(action);
, 会将menu
,加入associatedObjects
中。QToolBar::addAction
, 会创建一个QToolButton
, 加入associatedObjects
中,由QToolButton负责实际显示样式,QAction
主要负责显示状态的同步,以及触发动作等。- Qt6 之前可以使用
associatedWidgets