目录
1.菜单栏的介绍:
- 在 Qt 中,菜单栏是一个常用的 GUI 组件,用于组织和管理应用程序的各种命令。
- QMenuBar 是 Qt 提供的菜单栏类,它通常位于窗口的顶部,并包含一个或多个菜单,每个菜单又包含一个或多个动作项(QAction)。
- 一个主窗口最多只有一个菜单栏。
2.ui界面创建菜单/菜单项的方法:
3.通过代码方式创建菜单:
- 创建菜单栏:QMenuBar* menuBar = new menuBar();
- 将创建的菜单栏设置到窗口:this->setMenuBar(menuBar);
- 创建菜单项:QMenu* menu1=new QMenu("菜单项名称");
- 将菜单项添加到菜单栏:menuBar->addMenu(menu1);
- 创建菜单项的动作:QAction* action1=new QAction("动作名称");
- 将动作赋给菜单项:menu1->addAction(action1);
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); //创建菜单栏 QMenuBar* menuBar=new QMenuBar(); this->setMenuBar(menuBar); //创建菜单项 QMenu* menu1=new QMenu("选项1"); QMenu* menu2=new QMenu("选项2"); QMenu* menu3=new QMenu("选项3"); QMenu* menu4=new QMenu("选项4"); QMenu* menu5=new QMenu("选项5"); //将菜单项添加到菜单栏 menuBar->addMenu(menu1); menuBar->addMenu(menu2); menuBar->addMenu(menu3); menuBar->addMenu(menu4); menuBar->addMenu(menu5); //创建动作 QAction* action1=new QAction("1"); QAction* action2=new QAction("2"); QAction* action3=new QAction("3"); QAction* action4=new QAction("4"); QAction* action5=new QAction("5"); //为菜单项赋予动作 menu1->addAction(action1); menu2->addAction(action2); menu3->addAction(action3); menu4->addAction(action4); menu5->addAction(action5); }
4.为动作绑定槽函数:
- 当点击动作时,会触发一个triggered信号。
- connect(action1,&QAction::triggered,this,&MainWindow::槽函数);
5.为动作绑定快捷键:
- 在字段后加一个圆括号,里面写‘ &+键位 ’ ,就可以绑定快捷键。
- 绑定后,会在字段后面显示快捷键位,但是不会显示&符号。
- 使用alt+键位,使用快捷键。比如要打开选项1,就是由:alt+a。
6. 为动作添加动作:
- 此时将动作看作一个菜单,为其添加动作。类似于菜单的子菜单。
- 可以无线向下延申出子菜单。
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); //创建菜单栏 QMenuBar* menuBar=new QMenuBar(); this->setMenuBar(menuBar); //创建父菜单 QMenu* menu_1=new QMenu("父菜单"); menuBar->addMenu(menu_1); //创建子菜单 QMenu* menu_2=new QMenu("子菜单"); menu_1->addMenu(menu_2); //创建动作 QAction* action1=new QAction("动作1"); QAction* action2=new QAction("动作2"); QAction* action3=new QAction("动作3"); //将动作添加到子菜单 menu_2->addAction(action1); menu_2->addAction(action2); menu_2->addAction(action3); }
7.分割线,分隔开部分动作:
- 使用QMenu类的addSeparator()方法,添加分割线。
8.为动作/菜单项设置图标:
- 对动作使用setIcon(QIcon(qrc路径))方法,为动作添加图标。
- 同时也可以为菜单项添加图标,但是菜单项设置图标后,就不再显示文本,只会显示图标。
9.手动创建菜单栏导致的内存泄漏问题:
- 如果在创建文件时,勾选了自动生成ui文件,编译器就会自动生成一个菜单栏。
- 如果我们再手动new一个菜单栏,并且将这个new的菜单栏设置到窗口,就会导致编译器自动生成的菜单栏脱离对象树。
- 脱离对象树之后,就无法对这个菜单栏对象进行释放,就会导致内存泄漏。
- 虽然这种泄漏。几乎不会有什么影响,但是还是解决了为好,下面是解决方法。
- 使用新的写法:
- QMenuBar* menuBar=this->menuBar();
- 来代替旧的写法:
- QMenuBar* menuBar=new QMenuBar();+ this->setMenuBar(menuBar);
- 这样写,如果已经存在QMenuBar对象,会返回这个对象。
- 如果不存在QMenuBar对象,就会先生成一个QMenuBar对象,再返回。