Qt 窗口是通过 QMainWindow类 来实现的
创建菜单栏
Qt 中的菜单栏是通过 QMenuBar 这个类来实现的,一个窗口最多只有一个菜单栏。
菜单栏包含了菜单,而菜单又包含了菜单项
上图可以看出,菜单里面不只是可以包含菜单项,也可以包含菜单,这种被菜单包含的菜单成为子菜单
可以有两种方式创建菜单栏:
QMenuBar *menuBar = new QMenuBar();
this->setMenuBar(menuBar);
QMenuBar *menuBar = this->menuBar();
this->setMenuBar(menuBar);
对于菜单栏而言,在QMainWindow类对象被创建出来时默认是自动生成了一个菜单栏的。
因此对于第一种方式而言:通过重新new出来一个 QMenuBar 对象再赋值给 this,这种方式就会导致 this 默认自动生成的菜单栏被挤出对象树,这种情况就会导致找不到默认的菜单栏从而无法释放。虽然对于客户端而言这一点点的泄漏问题可以不会很大,但是还是做到尽量完美。
对于第二种方式而言:this->menuBar() 会有两种情况:当 this 没有菜单栏时会自动生成一个菜单栏;当 this 有菜单栏时就获取已有的菜单栏。所以第二种方式就不会多生成出额外的菜单栏对象,也就不会出现内存泄漏的情况。
创建菜单并在菜单栏中添加
菜单的类型为 QMenu,菜单栏通过 addMenu 函数去添加菜单
// 创建菜单
// (&?):设置快捷键(?可以是任一字母)
// 菜单的快捷键需要搭配 alt 键使用
QMenu *m1 = new QMenu("文件(&F)");
QMenu *m2 = new QMenu("编辑(&E)");
QMenu *m3 = new QMenu("构建(&B)");
// 将菜单加到菜单栏
menuBar->addMenu(m1);
menuBar->addMenu(m2);
menuBar->addMenu(m3);
创建子菜单并添加到菜单
添加子菜单的方式:先创建出需要的子菜单(子菜单也是菜单,也是 QMenu 类型),然后菜单可以通过 addMenu 函数添加子菜单。
// 创建子菜单
QMenu *c1 = new QMenu("最近打开文件");
// 将子菜单加到菜单
m1->addMenu(c1);
创建菜单项并在菜单中添加
在 Qt 中并没有专门的菜单项类,可以通过 QAction 类抽象出公共的动作。
菜单项也可以为自己添加图标,setIcon(QIcon *)
// 创建菜单项