0.前言
- Qt窗⼝是通过
QMainWindow
类来实现的QMainWindow
是⼀个为⽤⼾提供主窗⼝程序的类,继承⾃QWidget
类
QMainWindow
提供了⼀个预定义的布局QMainWindow
包含⼀个菜单栏(menubar
)、多个⼯具栏(toolbars
)、多个浮动窗⼝(铆接部件)(dockwidgets
)、⼀个状态栏(statusbar
)和⼀个中⼼部件(centralwidget
)
- 它是许多应⽤程序的基础,如⽂本编辑器,图⽚编辑器等
1.菜单栏
0.是什么?
- Qt中的菜单栏是通过
QMenuBar
这个类来实现的
1.创建菜单栏
- 方式一:借助于
QMainWindow
类提供的menuBar()
来实现(更安全)- 函数原型:
QMenuBar* menuBar() const
- 功能:如果
QMenuBar
已经存在,直接获取并返回,如果不存在,就先创建一个新的,再返回
// 创建菜单栏 QMenuBar* menubar = menuBar();// 将菜单栏放入窗口中 this->setMenuBar(menubar);
- 函数原型:
- 方式二:在堆上动态创建
QMenuBar* menubar = new QMenuBar(this);// 将菜单栏放入窗口中 this->setMenuBar(menuBar);
2.在菜单栏中添加菜单
- 创建菜单,并通过
QMenuBar
提供的addMenu()
来添加菜单// 创建菜单栏 QMenuBar* menubar = menuBar();// 将菜单栏放入窗口中 this->setMenuBar(menubar);// 创建菜单 QMenu* menu1 = new QMenu("文件"); QMenu* menu2 = new QMenu("编辑"); QMenu* menu3 = new QMenu("视图");// 添加菜单到菜单栏中 menuBar->addMenu(menu1); menuBar->addMenu(menu2); menuBar->addMenu(menu3);
- 菜单也可以添加子菜单,通过
QMenu
提供的addMenu()
来添加子菜单QMenuBar* menuBar = new QMenuBar(); this->setMenuBar(menuBar);QMenu* menuParent = new QMenu("父菜单"); QMenu* menuChild = new QMenu("子菜单");menuBar->addMenu(menuParent); menuParent->addMenu(menuChild);QAction* act1 = new QAction("菜单项1"); QAction* act2 = new QAction("菜单项2"); menuChild->addAction(act1); menuChild->addAction(act2);QMenu* menuChild2 = new QMenu("子菜单2"); menuChild->addMenu(menuChild2);
3.创建菜单项
- 在Qt中,并没有专⻔的菜单项类
- 可以通过
QAction
类,抽象出公共的动作,如在菜单中添加菜单项QAction
可以给菜单栏使⽤,也可以给⼯具栏使⽤
// 创建菜单项QAction* act1 = new QAction("open");QAction* act2 = new QAction("close");QAction* act3 = new QAction("create");// 将菜单项添加到菜单上menu1->addAction(act1);menu1->addAction(act2);menu1->addAction(act3);// 可以通过connect给action添加信号槽,以实现功能connect(action1, &QAction::triggered, this, &MainWindow::handle);connect(action5, &QAction::triggered, this, &MainWindow::close);
4.给菜单和菜单项设置快捷键
- 方式一:通过给文本中添加类似
&A
这样的操作,就是添加了快捷键alt + A
&
这个符号并不会在界面上显示- 示例:
QMenu* menu1 = new QMenu("文件 (&F)"); QMenu* menu2 = new QMenu("编辑 (&E)"); QMenu* menu3 = new QMenu("视图 (&V)"); QMenu* menu4 = new QMenu("关于 (&A)");QAction* act1 = new QAction("act1 (&Q)"); QAction* act2 = new QAction("act2 (&W)"); QAction* act3 = new QAction("act3 (&E)"); QAction* act4 = new QAction("act4 (&R)");
- 方式二:通过
QShortCut
类实现,不过相对麻烦
5.在菜单项之间添加分割线
- 添加分割线是通过
QMenu
类提供的addSeparator()
来实现的 - 分割线添加的位置,和菜单项和分割线的
add
顺序有关// 创建菜单项QAction* act1 = new QAction("open");QAction* act2 = new QAction("close");QAction* act3 = new QAction("create");// 将菜单项添加到菜单上menu1->addAction(act1);menu1->addSeparator(); // 在"open"和"close"中间添加分割线menu1->addAction(act2);menu1->addAction(act3);
6.给菜单和菜单项添加图标
- 添加图标需要使用到
QIcon
类- 如果
QMenu
是长在QMenuBar
上- 给菜单添加图标后,该菜单只会显示这个图标,而不会显示其文本(图标覆盖了文本)
- 如果
QMenu
是子菜单- 图标和文本都能显示
QMenu* menu = new QMenu("菜单"); menu->setIcon(QIcon(":/open.png"));QAction* act1 = new QAction("菜单项1"); action1->setIcon(QIcon(":/open.png"));
- 如果