目录
使用Qt设计及界面时,常用的两种方式添加菜单,第一使用UI界面添加,第二种 在代码中添加菜单。
常用设置函数
action->setChecked(true); // 设置为选中状态
多个QAction的单选设置
void MainWindow::initUi() { QActionGroup* toolGroup = new QActionGroup(this); toolGroup->addAction(this->ui->drawLine); toolGroup->addAction(this->ui->drawCircle); toolGroup->addAction(this->ui->drawEllipse); toolGroup->addAction(this->ui->selectTool); toolGroup->addAction(this->ui->fillPolygon); toolGroup->addAction(this->ui->fillFence); toolGroup->addAction(this->ui->drawPolygon); toolGroup->setExclusionPolicy(QActionGroup::ExclusionPolicy::ExclusiveOptional); } |
菜单相关类
QMenuBar --菜单栏类,即下图中红色区域标记,菜单栏类给窗口提供水平菜单栏,此菜单栏占用窗口上方区域,垂直高度不变,水平宽度为窗口宽度,可随窗口大小变化而变化。如下图中“测试”,“test1”,"test2"所在的栏几位QMenuBar
QMenu --菜单项,即下图中绿色区域,下图中“测试”,"test1","test2"都是一个独立的菜单,包含各个子菜单。QMenu还可以用来创建弹出菜单。
QAction --子菜单,即下图中蓝色区域标记的内容,一个子菜单对应一个操作。
系统菜单的生成和响应
使用代码添加系统菜单
示例源码:
.h文件
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QMenuBar> QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACE class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = nullptr); ~MainWindow(); //菜单栏 QMenuBar *pMenuBar; //菜单项 QMenu *pMenuTest; QMenu *pMenuTest1; QMenu *pMenuTest2; //子菜单 QAction *pActionTest; QAction *pActionTest1; QAction *pActionTest2; QAction *pActionTest3; QAction *pActionTest4; QAction *pActionTest5; QAction *pActionTest6; public slots: //菜单响应函数 void OnActionTest(); void OnActionTest1(); private: Ui::MainWindow *ui; }; #endif //MAINWINDOW_H |
.cpp文件
#include "mainwindow.h" #include "ui_mainwindow.h" #include <QDialog> //是否启用QMainWindow自带的菜单栏 //#define USE_DEFAULT_MENU_BAR MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); //指定菜单栏 #ifdef USE_DEFAULT_MENU_BAR //添加菜单栏(此处添加为的为QMainWindow自带的菜单) pMenuBar = this->menuBar(); #else //添加自定义菜单 pMenuBar = new QMenuBar(this); #endif //定义菜单项 //(&n)代表快捷方式,当窗口获得焦点时按alt+n即可打开“测试”菜单项 pMenuTest = new QMenu("测试(&n)",this); pMenuTest1 = new QMenu("test1",this); pMenuTest2 = new QMenu("test2",this); //定义子菜单 //(&s)为子菜单快捷键,当打开该菜单项后,按下‘s’键即可响应 pActionTest = new QAction("测试(&s)",this); //新建一个带图标的菜单项,图标使用资源文件中的资源 pActionTest1 = new QAction(QIcon(":/new/prefix1/resource/soccer_ball.ico"),"测试1",this); pActionTest2 = new QAction("测试2",this); pActionTest3 = new QAction("测试3(&Y)",this); pActionTest4 = new QAction("测试4",this); pActionTest5 = new QAction("测试5(&M)",this); pActionTest6 = new QAction("测试6",this); //将菜单项添加到子菜单 pMenuTest->addAction(pActionTest); pMenuTest->addAction(pActionTest1); //在菜单项之间添加分割线 pMenuTest->addSeparator(); pMenuTest->addAction(pActionTest2); pMenuTest1->addAction(pActionTest3); pMenuTest1->addAction(pActionTest4); pMenuTest2->addAction(pActionTest5); pMenuTest2->addAction(pActionTest6); //将子菜单添加到菜单栏 pMenuBar->addMenu(pMenuTest); pMenuBar->addMenu(pMenuTest1); pMenuBar->addMenu(pMenuTest2); #ifndef USE_DEFAULT_MENU_BAR //当不使用QMainWindow自带的菜单栏时,必须要加上此行 setMenuBar(pMenuBar); #endif //添加菜单响应函数 connect(pActionTest,&QAction::triggered,this,&MainWindow::OnActionTest); connect(pActionTest1,&QAction::triggered,this,&MainWindow::OnActionTest); } //菜单响应函数 void MainWindow::OnActionTest() { QDialog dlg; dlg.setWindowTitle("测试菜单响应"); dlg.exec(); } void MainWindow::OnActionTest1() { QDialog dlg; dlg.setWindowTitle("测试菜单响应"); dlg.exec(); } MainWindow::~MainWindow() { delete ui; } |
上面的代码中定义了两种创建系统菜单的方式:调用QMainWindow自带的菜单栏和自己新建菜单栏,由第6行定义的宏控制,显示效果相同。
第25行为“测试”子菜单添加快捷键,当窗口获得焦点时按alt+n可展开“测试”子菜单。
第31行为“测试”子菜单“测试”菜单项添加快捷键,当“测试”子菜单弹出后按‘s’键,程序即可做出响应。
第33行为“测试”子菜单的“测试2”菜单项添加了图标。
第44行为“测试”子菜单的“测试2”和“测试3”之间添加了分割线。
使用UI设计器设计系统菜单
1、添加菜单项
直接输入菜单项名称,然后回车即可。
2、为菜单项设置图标
在动作编辑器上,右键选择编辑,然后添加图标
如果想在图标栏添加该菜单的快捷图标,直接将该动作项拖放只图标栏即可。
3、事件响应函数
我们的对象名称为:actionOpenFile,默认情况我们只需要添加槽函数:
public slots:
void on_actionOpenFile_triggered();
当菜单被点击时,该事件将出发,槽函数命名规则为:on_对象名称_triggered,如果你觉得这个名字太长,可以自定义槽函数,然后通过connect进行连接:
connect(ui.actionOpenFile, SIGNAL(triggered()), this, SLOT(OnActionOpenFile()));
进入“设计”页面,进入如下图所示的界面,具体操作方法见如下两张图,注意:输入菜单名称后一定要按“Enter”键才能生效。
注意: 子菜单可能无法输入中文,可在Action Editor 中修改文本与提示信息