QMainWindow
OVERVIEW
- QMainWindow
- 一、QMainWindow
- 1.菜单栏
- 2.工具栏
- 3.状态栏
- 4.铆接部件
- 5.核心部件
- 6.练习
- 二、ui资源文件
QMainWindow是一个为用户提供主窗口程序的类,包含一个菜单栏menu bar、多个工具栏tool bars、多个锚接部件dock widgets、一个状态栏status bar及一个中心部件central widget,是许多应用程序的基础,如文本编辑器、图片编辑器等。
一、QMainWindow
1.菜单栏
一个主窗口最多只有一个菜单栏,位于主窗口顶部、主窗口标题栏下面。
-
创建菜单栏,通过QMainWindow类的
menubar()
函数获取主窗口菜单栏指针QMenuBar* menuBar() const
-
创建菜单,通过调用QMenu的成员函数
addMenu()
来添加菜单QAction* addMenu(QMenu* menu) QMenu* addMenu(const QString& title) QMenu* addMenu(const QIcon& icon, const QString& title)
-
创建菜单项,调用QMenu的成员函数addAction来添加菜单项
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对象添加到菜单就显示成一个菜单项,添加到工具栏就显示成一个工具按钮。用户可以通过点击菜单项、点击工具栏按钮、点击快捷键来激活这个动作。
2.工具栏
主窗口的工具栏上可以有多个工具条,通常采用一个菜单对应一个工具条的方式,也可根据需要进行工具条的划分。
- 直接调用QMainWindow类的
addToolBar()
函数获取主窗口的工具条对象,每增加一个工具条都需要调用一次该函数。 - 插入属于工具条的动作,即在工具条上添加操作,通过QToolBar类的addAction函数添加。
- 工具条是一个可移动的窗口,它的停靠区域由QToolBar的allowAreas决定,包括:
- Qt::LeftToolBarArea 停靠在左侧
- Qt::RightToolBarArea 停靠在右侧
- Qt::TopToolBarArea 停靠在顶部
- Qt::BottomToolBarArea 停靠在底部
- Qt::AllToolBarAreas 以上四个位置都可停靠
- 使用
setAllowedAreas()
函数指定停靠区域 - 使用
setMoveable()
函数设定工具栏的可移动性
3.状态栏
状态栏派生自QWidget类,使用方法与QWidget类似且最多只能有一个,QStatusBar类常用成员函数:
void addWidget(QWidget * widget, int stretch = 0)//添加小部件
int insertWidget(int index, QWidget * widget, int stretch = 0)//插入小部件
void removeWidget(QWidget * widget)//删除小部件
4.铆接部件
铆接部件 QDockWidget,也称浮动窗口,可以有多个。
QDockWidget *dock = new QDockWidget("title",this);
addDockWidget(Qt::LeftDockWidgetArea,dock);
dock->setAllowedAreas(Qt::TopDockWidgetArea | Qt::BottomDockWidgetArea);//设置区域范围
5.核心部件
除了以上几个部件,中心显示的部件都可以作为核心部件,例如一个记事本文件,可以利用QTextEdit做核心部件
QTextEdit *tedit = new QTextEdit(this);
setCentralWidget(edit);
6.练习
#include <QMenuBar>
#include <QToolBar>
#include <QStatusBar>
#include <QDockWidget>
#include <QTextEdit>
#include <QLabel>
#include <QDebug>
#include <QPushButton>
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent):QMainWindow(parent), ui(new Ui::MainWindow) {
ui->setupUi(this);
//1.菜单栏(只能有1个)
QMenuBar *mbar = menuBar();//系统提供的方法menuBar()创建菜单栏
setMenuBar(mbar);
QMenu *mfile = mbar->addMenu("file");//创建菜单
mfile->addAction("new file");//创建菜单项
mfile->addAction("open file");
mfile->addAction("close file");
mfile->addSeparator();//添加分隔符
mfile->addAction("save");
mfile->addAction("save as");
QMenu *medit = mbar->addMenu("edit");
medit->addAction("undo");
medit->addAction("redo");
medit->addAction("copy");
medit->addAction("paste");
medit->addAction("select all");
medit->addAction("select encoding");
//2.工具栏(可以有多个)
QToolBar *tbar = new QToolBar(this);
addToolBar(Qt::LeftToolBarArea, tbar);//默认工具栏停靠在左侧
tbar->setAllowedAreas(Qt::LeftToolBarArea |Qt::RightToolBarArea);//设置工具栏只允许左右停靠
tbar->setFloatable(false);//禁止浮动工具栏
tbar->setMovable(false);//禁止工具栏移动
tbar->addAction("welcome");
tbar->addAction("projects");
tbar->addAction("design");
tbar->addAction("debug");
tbar->addSeparator();
tbar->addAction("help");
tbar->addAction("bookmark");
//3.状态栏(只能有1个)
QStatusBar *sbar = statusBar();
setStatusBar(sbar);
QLabel *labell = new QLabel("detail info", this);
sbar->addWidget(labell);
QLabel *labelr = new QLabel("other info", this);
sbar->addPermanentWidget(labelr);
//4.铆接部件 浮动窗口(可以有多个)
QDockWidget *dwt = new QDockWidget("float", this);
dwt->setAllowedAreas(Qt::TopDockWidgetArea | Qt::BottomDockWidgetArea);
addDockWidget(Qt::BottomDockWidgetArea, dwt);
//5.核心部件(只能有1个)
QTextEdit *tedit = new QTextEdit(this);
setCentralWidget(tedit);
}
MainWindow::~MainWindow() {
delete ui;
}
二、ui资源文件
Qt 资源系统是一个跨平台的资源机制,用于将程序运行时所需要的资源以二进制的形式存储于可执行文件内部。如果程序需要加载特定的资源图标、文本等,那么将其放置在资源文件中就不需要担心文件丢失(编译到可执行文件内部)。
- 将资源文件拷贝到项目目录下,
- 右键项目添加Qt resource file,为资源文件起名如res,生成res.qrc文件
- 添加前缀和文件
- 使用资源:
ui->actionopen->setIcon(QIcon(":/res/img/ParticleSmoke.png"));
这么使用资源文件可能带来的一个问题是,如果以后我们要更改文件名,比如将 ParticleSmoke.png 改成 smile.png,那么所有使用了这个名字的路径都需要修改。所以更好的办法是给该文件取一个别名,用别名来引用该文件。
这样就可以直接使用:/res/refer
引用到这个资源,无需关心图片的真实文件名。
如果使用文本编辑器打开 res.qrc 文件,就会看到以下内容:
<RCC>
<qresource prefix="/res">
<file>img/filetransfer.png</file>
<file alias="refer">img/ParticleSmoke.png</file>
</qresource>
</RCC>
当编译工程之后可以在构建目录中找到 qrc_res.cpp 文件,这就是 Qt 将项目的资源编译成了 C++ 代码,