QMainWindow是一个为用户提供主窗口程序的类,包含一个菜单栏(menu bar)、多个工具栏(tool bars)、多个锚接部件(dock widgets)、一个状态栏(status bar)及一个中心部件(central widget),是许多应用程序的基础,如文本编辑器,图片编辑器等。
一个主窗口最多只有一个菜单栏。位于主窗口顶部、主窗口标题栏下面。
(1)创建菜单栏
通过QMainWindow类的menubar()函数获取主窗口菜单栏指针
函数原型
QMenuBar* menuBar() const;
创建
- // 菜单栏,最多只能有一个
- QMenuBar* bar = menuBar();
(2)将菜单项设置到窗口中
- // 将菜单栏设置到窗口中
- this->setMenuBar(bar);
这是运行还是没有显示,因为菜单栏没有内容。
(3)添加菜单
- QAction* addMenu(QMenu * menu);
- QMenu* addMenu(const QString & title);
- QMenu* addMenu(const QIcon & icon, const QString & title);
目前只有第二个熟悉
- QMenu* fileMenu = bar->addMenu("文件");
- QMenu* editMenu = bar->addMenu("编辑");
查看效果
(4)创建菜单项
函数原型
- QAction* activeAction() const;
-
- QAction* addAction(const QString & text);
-
- QAction* addAction(const QIcon & icon, const QString & text);
-
- QAction* addAction(const QString & text, const QObject * receiver,
- const char * member, const QKeySequence & shortcut = 0);
-
- QAction* addAction(const QIcon & icon, const QString & text,
- const QObject * receiver, const char * member,
- const QKeySequence & shortcut = 0);
Qt 并没有专门的菜单项类,只是使用一个QAction类,抽象出公共的动作。当我们把QAction对象添加到菜单,就显示成一个菜单项,添加到工具栏,就显示成一个工具按钮。用户可以通过点击菜单项、点击工具栏按钮、点击快捷键来激活这个动作。
- // 菜单项
- QAction* newAction = fileMenu->addAction("新建");
- // 添加分割线
- fileMenu->addSeparator();
- QAction* openAction = fileMenu->addAction("打开");
还可以添加子菜单
- // 菜单项中有子菜单
- QMenu* subMenu = new QMenu;
- subMenu->addAction("子菜单1");
- subMenu->addAction("子菜单2");
- newAction->setMenu(subMenu);
完整代码
- #include "mainwindow.h"
- #include <QMenuBar>
-
-
- MainWindow::MainWindow(QWidget *parent)
- : QMainWindow(parent)
- {
- // 重置窗口尺寸
- resize(600, 400);
-
- // 1 菜单栏,最多只能有一个
- QMenuBar* bar = menuBar();
- // 将菜单栏设置到窗口中
- this->setMenuBar(bar);
- // 添加菜单
- QMenu* fileMenu = bar->addMenu("文件");
- QMenu* editMenu = bar->addMenu("编辑");
-
- // 菜单项
- QAction* newAction = fileMenu->addAction("新建");
- // 添加分割线
- fileMenu->addSeparator();
- QAction* openAction = fileMenu->addAction("打开");
-
- // 菜单项中有子菜单
- QMenu* subMenu = new QMenu;
- subMenu->addAction("子菜单1");
- subMenu->addAction("子菜单2");
- newAction->setMenu(subMenu);
- }
效果
步骤:
(1)新建菜单栏,只能有一个;
(2)将菜单栏设置到窗口中;
(3)添加菜单;
(4)添加菜单项(添加分割线);
(5)菜单中有子菜单,添加子菜单。
主窗口的工具栏上可以有多个工具条,通常采用一个菜单对应一个工具条的的方式,也可根据需要进行工具条的划分。
(1)创建工具栏
- 工具栏,可以有多个
- QToolBar* toolBar = new QToolBar(this);
(2)将工具栏放到窗口中
- // 将工具栏放到窗口中
- // addToolBar(toolBar); // 默认停靠在上侧
- addToolBar(Qt::LeftToolBarArea, toolBar); // 设置停靠位置
- // 只允许在左右停靠
- toolBar->setAllowedAreas(Qt::LeftToolBarArea | Qt::RightToolBarArea);
- // 设置浮动,关掉浮动
- toolBar->setFloatable(false);
- // 设置移动,不能移动
- toolBar->setMovable(false);
停靠位置查看
- Qt::LeftToolBarArea // 停靠在左侧
- Qt::RightToolBarArea // 停靠在右侧
- Qt::TopToolBarArea // 停靠在顶部
- Qt::BottomToolBarArea // 停靠在底部
- Qt::AllToolBarAreas // 以上四个位置都可停靠
效果,工具栏在左侧
(3)工具栏可以添加菜单项。和文件里面的功能一样
- toolBar->addAction(newAction);
- // 添加分割线
- toolBar->addSeparator();
- toolBar->addAction(openAction);
完整代码
- #include "mainwindow.h"
- #include <QMenuBar>
- #include <QToolBar>
-
- MainWindow::MainWindow(QWidget *parent)
- : QMainWindow(parent)
- {
- // 重置窗口尺寸
- resize(600, 400);
-
- // 1 菜单栏,最多只能有一个
- QMenuBar* bar = menuBar();
- // 将菜单栏设置到窗口中
- this->setMenuBar(bar);
- // 添加菜单
- QMenu* fileMenu = bar->addMenu("文件");
- QMenu* editMenu = bar->addMenu("编辑");
-
- // 菜单项
- QAction* newAction = fileMenu->addAction("新建");
- // 添加分割线
- fileMenu->addSeparator();
- QAction* openAction = fileMenu->addAction("打开");
-
- // 菜单项中有子菜单
- QMenu* subMenu = new QMenu;
- subMenu->addAction("子菜单1");
- subMenu->addAction("子菜单2");
- newAction->setMenu(subMenu);
-
-
- // 2 工具栏,可以有多个
- QToolBar* toolBar = new QToolBar(this);
- // 将工具栏放到窗口中
- // addToolBar(toolBar);
- addToolBar(Qt::LeftToolBarArea, toolBar); // 设置停靠位置
- // 只允许在左右停靠
- toolBar->setAllowedAreas(Qt::LeftToolBarArea | Qt::RightToolBarArea);
- // 设置浮动,关掉浮动
- toolBar->setFloatable(false);
- // 设置移动,不能移动
- toolBar->setMovable(false);
- // 工具栏可以添加菜单项。和文件里面的功能一样
- toolBar->addAction(newAction);
- // 添加分割线
- toolBar->addSeparator();
- toolBar->addAction(openAction);
- }
效果
步骤:
(1)新建工具栏,可以有多个;
(2)将工具栏放到窗口中;
(3)工具栏可以添加菜单项。和文件里面的功能一样。
派生自QWidget类,使用方法与QWidget类似,QStatusBar类常用成员函数:
状态栏也只能最多有一个。
word的下面的信息就是状态栏
(1)添加状态栏(头文件QStatusBar)
QStatusBar* sBar = statusBar();
注意:这里不用于new
(2)将状态栏添加到窗口
- // 添加到窗口
- this->setStatusBar(sBar);
(3)给状态栏添加信息
状态栏一般是提示信息(头文件QLabel)
- // 添加标签。提示的文本和父窗口
- QLabel* label1 = new QLabel("左侧信息", this);
- sBar->addWidget(label1);
效果
也可以在右测添加信息、也可以插入信息
- // 加到右侧信息
- QLabel* label2 = new QLabel("右侧信息", this);
- sBar->addPermanentWidget(label2);
-
- // 中间插入信息
- QLabel* label3 = new QLabel("中间信息", this);
- sBar->insertWidget(1, label3);
完整代码
- #include "mainwindow.h"
- #include <QMenuBar>
- #include <QToolBar>
- #include <QStatusBar>
- #include <QLabel>
-
- MainWindow::MainWindow(QWidget *parent)
- : QMainWindow(parent)
- {
-
-
- // 3、状态栏。只能有一个,不用new
- QStatusBar* sBar = statusBar();
- // 添加到窗口
- this->setStatusBar(sBar);
- // 添加标签。提示的文本和父窗口
- QLabel* label1 = new QLabel("左侧信息", this);
- sBar->addWidget(label1);
-
- // 加到右侧信息
- QLabel* label2 = new QLabel("右侧信息", this);
- sBar->addPermanentWidget(label2);
-
- // 中间插入信息
- QLabel* label3 = new QLabel("中间信息", this);
- sBar->insertWidget(1, label3);
- }
铆接部件 QDockWidget,也称浮动窗口,可以有多个。
头文件QDockWidget
添加铆接部件
QDockWidget* dock = new QDockWidget("浮动窗口", this);
设置到窗口中
- // 设置到窗口中,添加到下侧,围绕中间, 没有中心部件,就在上侧
- this->addDockWidget(Qt::BottomDockWidgetArea ,dock);
效果
因为没有中心部件,所以铆接部件在上侧
添加中心部件:除了以上几个部件,中心显示的部件都可以作为核心部件,例如一个记事本文件,可以利用QTextEdit做核心部件
- // 5、中心部件,核心部件,也只能有一个
- QTextEdit* edit = new QTextEdit(this);
- // 添加到窗口
- setCentralWidget(edit);
效果
铆接部件也可以只设置在某些位置,比如只设置在上下位置
- // 设置只允许在上侧和下侧
- dock->setAllowedAreas(Qt::BottomDockWidgetArea | Qt::TopDockWidgetArea);
效果
无法移动到其他位置
如果只有一个,像菜单栏、中心部件,则添加到窗口时,使用set函数;
如果有多个,像工具栏、状态栏,则添加到窗口时,使用add函数;