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,会自动更新到按钮上。

注意

QAction并不是一个QWidget

  • menu->addAction(action);, 会将 menu,加入 associatedObjects 中。
  • QToolBar::addAction, 会创建一个 QToolButton , 加入 associatedObjects 中,由QToolButton负责实际显示样式,QAction 主要负责显示状态的同步,以及触发动作等。
  • Qt6 之前可以使用 associatedWidgets