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
posted @ 2025-09-29 11:35  YueSS  阅读(8)  评论(0)    收藏  举报