繁体   English   中英

如何使 QMenu 项目在 QT 中可检查

[英]How to make QMenu Item checkable in QT

如何使用 QT 使 Qmenu 项目可检查

QMenu *preferenceMenu = new QMenu();
preferenceMenu  = editMenu->addMenu(tr("&Preferences"));

QMenu *Mode1 = new QMenu();
Mode1  = preferenceMenu->addMenu(tr("&Mode 1"));
Mode1->addAction(new QAction(tr("&Menu1"), this));

QMenu *Mode2 = new QMenu();
Mode2  = preferenceMenu->addMenu(tr("&Mode 2"));
Mode2->addAction(new QAction(tr("&Menu2"), this));
Mode2->addAction(new QAction(tr("&Menu3"), this));

在 QAction 上,我将插槽称为“slotActionTriggered(QAction* actionSelected)”

void csTitleBar::slotActionTriggered(QAction* actionSelected)
{
   actionSelected->setChecked(true);
}

如何在选定的菜单#中显示小勾号,以便用户知道选择了哪个当前我可以更改为所有菜单#,但我需要在菜单上显示一个小勾号,以便可以轻松识别所选的

小例子:

在此处输入图像描述

cmainwindow.h

#ifndef CMAINWINDOW_H
#define CMAINWINDOW_H

#include <QMainWindow>
#include <QPointer>

class CMainWindow : public QMainWindow
{
   Q_OBJECT

public:
   CMainWindow(QWidget *parent = 0);
   ~CMainWindow();

private slots:
   void slot_SomethingChecked();

private:
   QPointer<QAction> m_p_Act_Button1 = nullptr;
   QPointer<QAction> m_p_Act_Button2 = nullptr;
};

#endif // CMAINWINDOW_H

cmainwindow.cpp

#include "cmainwindow.h"
#include <QtWidgets>
#include <QDebug>

CMainWindow::CMainWindow(QWidget *parent)
   : QMainWindow(parent)
{
   m_p_Act_Button1 = new QAction("Super Button 1", this);
   m_p_Act_Button1->setCheckable(true);
   m_p_Act_Button1->setChecked(true);
   connect(m_p_Act_Button1, SIGNAL(triggered()), this, SLOT(slot_SomethingChecked()));

   m_p_Act_Button2 = new QAction("Super Button 2", this);
   m_p_Act_Button2->setCheckable(true);
   m_p_Act_Button2->setChecked(true);
   connect(m_p_Act_Button2, SIGNAL(triggered()), this, SLOT(slot_SomethingChecked()));

   QMenu *p_menu = menuBar()->addMenu("My Menu");
   p_menu->addAction(m_p_Act_Button1);
   p_menu->addAction(m_p_Act_Button2);
}

CMainWindow::~CMainWindow() { }

void CMainWindow::slot_SomethingChecked()
{
   if(!m_p_Act_Button1 || !m_p_Act_Button2) {return;}

   qDebug() << "Hi";
   if(m_p_Act_Button1->isChecked())
   {
      qDebug() << "The action 1 is now checked";
   }
   else
   {
      qDebug() << "The action 1 is now unchecked";
   }

   if(m_p_Act_Button2->isChecked())
   {
      qDebug() << "The action 2 is now checked";
   }
   else
   {
      qDebug() << "The action 2 is now unchecked";
   }

}

现代连接语法更可取。 可检查的项目也可以在上下文菜单中使用,如下所示:

void MyWidget::initContextMenu()
{
     if( _contextMenu)
     {
          delete _contextMenu;
     }

     _contextMenu = new QMenu(this);
     auto action1 = new QAction("Action Item 1", &_contextMenu);
     action1->setCheckable(true);
     action1->setChecked(getMyProperty1());
     connect(action1 , &QAction::triggered, this, &MyWidget::setMyProperty1);
     _contextMenu->AddAction( action1 );
}

void MyWidget::contextMenuEvent(QContextMenuEvent *event)
{        
    initContextMenu();      
    _contextMenu.popup(
            this->viewport()->mapToGlobal(
                event->pos()));         
}

bool MyWidget::setMyProperty1(bool state)
{
    _myProperty1 = state;
    emit MyPropertyChanged(_myProperty);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM