一、QMainWindow
QMainWindow是一个为用户提供主窗口程序的类,包含一个菜单栏(menu bar)、多个工具栏(tool bars)、多个锚接部件(dock widgets)、一个状态栏(status bar)及一个中心部件(central widget),是许多应用程序的基础,如文本编辑器,图片编辑器等。
1、菜单栏
一个主窗口最多只有一个菜单栏。位于主窗口顶部、主窗口标题栏下面。
1)创建菜单栏,通过QMainWindow类的menubar()函数获取主窗口菜单栏指针。
QMenuBar *QMainWindow::menuBar() const
void QMainWindow::setMenuBar(QMenuBar *menuBar)
菜单栏默认不会放入窗口中,需要调用setMenuBar()函数将菜单栏放入窗口中。
2)创建菜单,调用QMenuBar的成员函数addMenu来添加菜单。
QAction* addMenu(QMenu * menu)
QMenu* addMenu(const QString & title)
QMenu* addMenu(const QIcon & icon, const QString & title)
3)创建菜单项,调用QMenu的成员函数addAction来添加菜单项。
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)
可以在菜单项中添加分割线,函数如下:
QAction *QMenu::addSeparator()
4)示例
QMenuBar *mBar = menuBar();//菜单栏创建 最多只有一个 默认不会放入窗口中
//将菜单栏放入窗口中
setMenuBar(mBar);
//创建菜单
QMenu *fileMenu = mBar->addMenu("File");
QMenu *openMenu = mBar->addMenu("Edit");
//创建菜单项
QAction* newAction = fileMenu->addAction("new");
fileMenu->addSeparator();//添加分割符
QAction* openAction = fileMenu->addAction("open");
Qt 并没有专门的菜单项类,只是使用一个QAction类,抽象出公共的动作。当我们把QAction对象添加到菜单,就显示成一个菜单项,添加到工具栏,就显示成一个工具按钮。用户可以通过点击菜单项、点击工具栏按钮、点击快捷键来激活这个动作。
2、工具栏
主窗口的工具栏上可以有多个工具条,通常采用一个菜单对应一个工具条的的方式,也可根据需要进行工具条的划分。
1)创建工具栏,直接new一个QToolBar类的对象。默认也不会放入窗口中,需要调用调用QMainWindow类的addToolBar()函数获取主窗口的工具条对象,每增加一个工具条都需要调用一次该函数。
void QMainWindow::addToolBar(Qt::ToolBarArea area, QToolBar *toolbar)
void QMainWindow::addToolBar(QToolBar *toolbar)
QToolBar *QMainWindow::addToolBar(const QString &title)
2)插入属于工具条的动作,即在工具条上添加操作。通过QToolBar类的addAction函数添加。
void QWidget::addAction(QAction *action)
void QWidget::addActions(QList<QAction *> actions)
可以在工具条中添加分割线,函数如下:
QAction *QMenu::addSeparator()
还可以在工具条中添加按钮,使用如下函数:
QAction *QToolBar::addWidget(QWidget *widget)
3)工具条是一个可移动的窗口,它的停靠区域由QToolBar的allowAreas决定。使用setAllowedAreas()函数指定停靠区域
void setAllowedAreas(Qt::ToolBarAreas areas)
allowAreas枚举值如下:
- Qt::LeftToolBarArea:停靠在左侧
- Qt::RightToolBarArea:停靠在右侧
- Qt::TopToolBarArea:停靠在顶部
- Qt::BottomToolBarArea:停靠在底部
- Qt::AllToolBarAreas:以上四个位置都可停靠
使用setFloatable()函数设定工具栏的可浮动性:
void setFloatable(bool floatable)
使用setMoveable()函数设定工具栏的可移动性,若设置为否,拖动停靠、浮动设置值均无效:
void setMovable(bool movable)
4)示例
//工具栏 可以有多个 默认不会放入窗口中
QToolBar* toolBar = new QToolBar(this);
addToolBar(toolBar);//添加到窗口中 ,默认显示在上方
//addToolBar(Qt::leftToolBarArea,toolBar);//添加到窗口中 并默认在在左侧显示
//设置工具栏允许左右区域移动
toolBar->setAllowedAreas(Qt::LeftToolBarArea|Qt::RightToolBarArea);
//设置是否允许浮动
toolBar->SetFloatable(false);//不允许
//设置是否允许移动
toolBar->setMoveable(false);//不允许,设置之后 拖动停靠 浮动均无效
//工具栏总设置内容
toolBar->addAction(newAction);
toolBar->addSeparator();//添加分割线
toolBar->addAction(openAction);
//工具栏中添加按钮
QPushButton* btn = new QPushButton(this);
toolBar->addWidget(btn);
3、 状态栏
QStatusBar类,派生自QWidget类,使用方法与QWidget类似。 状态栏也只能最多有一个。
1)创建状态栏,通过QMainWindow类的statusBar()函数获取主窗口状态栏指针。
QStatusBar *QMainWindow::statusBar() const
void QMainWindow::setStatusBar(QStatusBar *statusbar)
状态栏默认不会放入窗口中,需要调用setStatusBar()函数将菜单栏放入窗口中。
2)将标签控件放入状态栏,调用QStatusBar的成员函数addWidget来添加菜单。
//添加小部件
void QStatusBar::addWidget(QWidget *widget, int stretch = 0)放在左侧
void QStatusBar::addPermanentWidget(QWidget *widget, int stretch = 0)//放在右侧
//插入小部件
int insertWidget(int index, QWidget * widget, int stretch = 0)
//删除小部件
void removeWidget(QWidget * widget)
3)示例
QStatusBar *stBar = statusBar();
setStatusBar(stBar);//放入窗口中
//将标签控件放入状态栏
QLable* lable = new QLable("tips",this);
stBar->addWidget(lable);//放在左侧
QLable* rightLable=new QLable("right tips",this):
stBar->setPermanentWidget(rightLable);//放在右侧
4、 铆接部件(浮动窗口)
铆接部件 QDockWidget,也称浮动窗口,可以有多个。
1)创建铆接部件,直接new一个QDockWidget类的对象。默认也不会放入窗口中,需要调用调用QMainWindow类的addDockWidget()函数,每增加一个铆接部件需要调用一次该函数。
void QMainWindow::addDockWidget(Qt::DockWidgetArea area, QDockWidget *dockwidget)
void QMainWindow::addDockWidget(Qt::DockWidgetArea area, QDockWidget *dockwidget, Qt::Orientation orientation)
2)可以设置后期停靠的区域,使用setAllowedAreas()函数
void setAllowedAreas(Qt::DockWidgetAreas areas)
3)示例
//铆接部件(浮动窗口) 可以有多个
QDockWidget* dockWidget = new QDockWidget("float",this);
addDockWidget(Qt::BottomDockWidgetArea,dockWidet);//添加到下边
//设置后期停靠区域只允许上下停靠
dockWidget->setAllowedAreas(Qt::TopDockWidgetArea|Qt::BottomDockWidgetArea);
5、 中心部件
除了以上几个部件,中心显示的部件都可以作为核心部件,例如一个记事本文件,可以利用QTextEdit做核心部件。
设置中心部件使用函数setCentralWidget()
void QMainWindow::setCentralWidget(QWidget *widget)
示例:
QTextEdit* editText = new QTextEdit(this);
setCentralWidget(editText);
6、 总体示例
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMenuBar>
#include <QToolBar>
#include <QPushButton>
#include <QStatusBar>
#include <QLabel>
#include <QDockWidget>
#include <QTextEdit>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
resize(600,400);
//菜单栏创建 最多只有一个 默认不会放入窗口中
QMenuBar* mBar = menuBar();
//将菜单栏放入窗口中
setMenuBar(mBar);
//创建菜单
QMenu *fileMenu = mBar->addMenu("File");
QMenu *eidtMenu = mBar->addMenu("Eidt");
//创建菜单项
QAction *newAction = fileMenu->addAction("new");
//添加分隔线
fileMenu->addSeparator();
QAction* openAction = fileMenu->addAction("open");
//工具栏 可以有多个 默认不会放入窗口中
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);
//工具栏中添加按钮
QPushButton* btn = new QPushButton("AAA",this);
toolBar->addWidget(btn);
//状态栏 最多有一个
QStatusBar* stBar = statusBar();
setStatusBar(stBar);//放入窗口中
//标签控件放入状态栏
QLabel *lable = new QLabel("tips",this);
stBar->addWidget(lable);//放在左侧
QLabel *rightLable = new QLabel("right tips",this);
stBar->addPermanentWidget(rightLable);//放入右侧
//铆接部件(浮动窗口) 可以有多个
QDockWidget* dockWidet = new QDockWidget("float",this);
addDockWidget(Qt::BottomDockWidgetArea,dockWidet);//添加到下边
//设置后期停靠区域 只允许上下
dockWidet->setAllowedAreas(Qt::TopDockWidgetArea|Qt::BottomDockWidgetArea);
//设置中心部件 只能有一个
QTextEdit* editText = new QTextEdit(this);
setCentralWidget(editText);
}
二、资源文件
Qt 资源系统是一个跨平台的资源机制,用于将程序运行时所需要的资源以二进制的形式存储于可执行文件内部。如果你的程序需要加载特定的资源(图标、文本翻译等),那么,将其放置在资源文件中,就再也不需要担心这些文件的丢失。也就是说,如果你将资源以资源文件形式存储,它是会编译到可执行文件内部。
-
将需要的资源文件拷贝到项目位置下
-
右键项目->添加新文件 –> Qt - > Qt recourse File ->给资源文件起名
-
res 生成 res.qrc
-
open in editor 编辑资源
-
添加前缀 添加文件
-
使用 “ : + 前缀名 + 文件名 ”
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
// ui->actionnew->setIcon(QIcon("D:/Image/down.png"));
// 使用添加Qt资源 ":+前缀名+文件名"
ui->actionnew->setIcon(QIcon(":/Image/down.png"));
ui->actionopen->setIcon(QIcon(":/Image/butterfly.png"));
}
MainWindow::~MainWindow()
{
delete ui;
}