Qt窗口是通过QMainWindow类来实现的。
QMainWindow是一个为用户提供主窗口程序的类,继承子QWidget类,并且提供了一个预定义布局。QMainWindow 包含 ⼀个菜单栏(menu bar)、多个⼯具栏(tool bars)、多个浮动窗⼝(铆 接部件)(dock widgets)、⼀个状态栏(status bar) 和⼀个 中⼼部件(central widget),它是许多应⽤程序的基础,如⽂本编辑器,图⽚编辑器等。如下图为 QMainwindow 中 各组件所处的位置

菜单栏
Qt中的菜单栏是通过QMenuBar这个类来实现的。一个主窗口最多只有一个菜单栏。位于主窗口顶部、主窗口标题栏下面。

创建菜单栏
方式一:菜单栏的创建可以借用QMainWindow类提供的menuBar()函数来实现。

方式二:在堆上动态创建

使用setMenubar吧菜单放到窗口中
在菜单栏中添加菜单
创建菜单,并通过QMenu提供的addMenu()函数来添加菜单。

创建菜单项
在Qt中,并没有专门的菜单项类,可以通过QAction类,抽象出公共的动作。如在菜单中添加菜单项。
QAction 可以给菜单栏使⽤, 也可以给⼯具栏使⽤

在菜单项之间添加分割线
在菜单项之间可以添加分割线。添加分割线是通过QMenu类提供的addSeparator()函数实现的


综合实例
在窗口上创建一个菜单栏,在菜单栏中添加一些菜单,在某一个菜单中添加一些菜单项
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QTextEdit>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
// 设置标题
this->setWindowTitle("我的记事本");
// 创建菜单栏
QMenuBar* menubar = new QMenuBar(this);
this->setMenuBar(menubar);
// 创建菜单
QMenu* menu = new QMenu("文件");
menubar->addMenu(menu);
// 创建菜单项
QAction* action1 = new QAction("保存");
QAction* action2 = new QAction("加载");
menu->addAction(action1);
menu->addAction(action2);
connect(action1,&QAction::triggered,this,&MainWindow::save);
connect(action2,&QAction::triggered,this,&MainWindow::load);
// 创建中央控件
QTextEdit* edit = new QTextEdit(this);
this->setCentralWidget(edit);
edit->setPlaceholderText("请在此处输入内容");
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::save()
{
// 进行某些操作
}
void MainWindow::load()
{
// 进行某些操作
}
工具栏
⼯具栏是应⽤程序中集成各种功能实现快捷键使⽤的⼀个区域。可以有多个,也可以没有,它并不是应⽤程序中必须存在的组件。它是⼀个可移动的组件,它的元素可以是各种窗⼝组件,它的元素通常以图标按钮的⽅式存在。如下图为⼯具栏的⽰意图:

创建工具栏
调佣QMainWindow类的addToolBar()函数来创建工具栏,每增加一个工具栏都需要调用一次函数
如添加两个工具栏

设置停靠位置
工具栏停靠位置的设置有两种方式。一种是在创建工具栏的同时指定停靠的位置,另一种是通过QToolBar类提供的setAllowAreas()函数来设置
方式一:创建工具栏的同时指定其停靠的位置
在创建工具栏的同时,也可以设置工具栏的位置,其默认的位置是在窗口的最上面

方式二:使用QToolBar类提供的setAllowedAreas()函数设置停靠位置

设置浮动属性
工具栏的浮动属性可以通过QToolBar类提供的setFloatable()函数来设置、setFloatable()函数原型为:
void setFloatable(bool floatable)
参数:
true 浮动
false 不浮动

设置移动属性
设置好工具栏的移动属性可以通过QToolBar类提供的setMovable()函数来设置。setMovable()函数原型为
void setMovable(bool movable)
参数:
true 移动
false 不移动
如果设置工具栏位不移动的状态,则设置其停靠位置的操作就不会生效,所有设置工具栏的移动属性类似于总开关的效果。

综合实例
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QToolBar>
#include <QPushButton>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
// 设置窗口的大小
resize(800,600);
QToolBar* toolbar = new QToolBar(this);
// 设置工具栏的位置,默认是在窗口上方,此处设置为左侧
addToolBar(Qt::LeftToolBarArea,toolbar);
// 设置工具栏只允许停靠在左侧或者右侧
toolbar->setAllowedAreas(Qt::LeftToolBarArea|Qt::RightToolBarArea);
// // 设置浮动属性
toolbar->setFloatable(false);
// // 设置移动属性
toolbar->setMovable(true);
// 设置工具栏的内容
QAction* action1 = new QAction("open",this);
QAction* action2 = new QAction("new",this);
toolbar->addAction(action1);
toolbar->addSeparator();
toolbar->addAction(action2);
QPushButton* btn = new QPushButton("请点击我",this);
toolbar->addWidget(btn);
}
MainWindow::~MainWindow()
{
delete ui;
}

状态栏
状态栏是应⽤程序中输出简要信息的区域。⼀般位于主窗⼝的最底部,⼀个窗⼝中最多只能有⼀个状态栏。在 Qt 中,状态栏是通过 QStatusBar类 来实现的。 在状态栏中可以显⽰的消息类型
- 实时消息:如当前程序的状态
- 永久消息:程序版本号,机构名称
- 进度消息:如进度条提示,百分百提示
状态栏的创建
状态栏的创建是通过QMainWindow类提供的statusBar()函数来创建的

在状态栏中显示实时消息
在状态栏中显示实时消息时通过showMessage()函数来实现的

在状态栏中显示永久消息
在状态栏中可以显示永久消息,此处的永久消息时通过标签来显示的

天正显示的消息的位置

浮动窗口
在Qt中,浮动窗口也称之为铆接部件。浮动窗口通过QDockWIdget类来实现浮动的功能。浮动窗口一般是位于核心部件的周围,可以有多个。
浮动窗口的创建
浮动窗口的创建是通过QDockWidget类提供的构造方法QDockWidget()函数动态创建的

设置停靠的位置
浮动窗口是位于中心部件的周围。可以通过QDockWidget类中踢动setAllowedAreas()函数设置其允许停靠的位置。
对话框
对话框介绍
对话框时GUI程序中一个不可或缺的组成部分。一些不适合在主窗口实现的功能组件可以设置在对话框中。对话框通常是一个顶层窗口,出现在程序最上层,用于实现短期任务或者简洁的用户交互。Qt常用的内置对话框有:QFiledialog(⽂件对话框)、QColorDialog(颜⾊对话框)、QFontDialog(字体对话框)、QInputDialog (输⼊对话框)和 QMessageBox(消息框)
对话框的分类
对话框分为模态对话框和非模态对话框
模态对话框
模态对话框指的是:显⽰后⽆法与⽗窗⼝进⾏交互,是⼀种阻塞式的对话框。使⽤ QDialog::exec() 函数调⽤。
模态对话框适⽤于必须依赖⽤⼾选择的场合,⽐如消息显⽰,⽂件选择,打印设置等。
非模态对话框
⾮模态对话框显⽰后独⽴存在,可以同时与⽗窗⼝进⾏交互,是⼀种⾮阻塞式对话框,使⽤
QDialog::show()函数调⽤。
⾮模态对话框⼀般在堆上创建,这是因为如果创建在栈上时,弹出的⾮模态对话框就会⼀闪⽽过。同时还需要设置 Qt:WA_DeleteOnClose 属性,⽬的是:当创建多个⾮模态对话框时(如打开了多个⾮模态窗⼝),为了避免内存泄漏要设置此属性
⾮模态对话框适⽤于特殊功能设置的场合,⽐如查找操作,属性设置等
混合属性对话框
混合属性对话框同时具有模态对话框和⾮模态对话框的属性,对话框的⽣成和销毁具有⾮模态对话框属性,功能上具有模态对话框的属性
使⽤ QDialog::setModal() 函数 可以创建混合特性的对话框。通常,创建对话框时需要指定对话框的⽗组件。
Qt内置对话框
Qt提供了多种可复用的对话框类型,即Qt标准对话框。Qt标准对话框全部继承与QDialog类。常用的标准对话框
消息对话框QMessageBox
消息对话框时应用程序中最常见的界面元素。消息对话框最要用于为用户提供重要信息,强制用户进行选择操作。
颜色对话框 QColorDialog
颜⾊对话框的功能是允许⽤⼾选择颜⾊。继承⾃ QDialog 类。颜⾊对话框如下图⽰:
1、 QColorDialog (QWidget *parent = nullptr) //创建对象的同时设置⽗对象
2、 QColorDialog(const QColor &initial, QWidget *parent = nullptr) //创建对象的同时通过QColor
对象设置默认颜⾊和⽗对象
3、 void setCurrentColor(const QColor &color) //设置当前颜⾊对话框
4、 QColor currentColor() const //获取当前颜⾊对话框
5、 QColor getColor(const QColor &initial = Qt::white, QWidget *parent = nullptr, const QString
&title = QString(), QColorDialog::ColorDialogOptions options = ColorDialogOptions()) //打开颜⾊
选择对话框,并返回⼀个QColor对象
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
#include <QPushButton>
#include <QColorDialog>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
resize(800,600);
QPushButton* colorButton = new QPushButton("选择颜色",this);
// 创建颜色对话框
QColorDialog* colorDialog = new QColorDialog(this);
connect(colorButton,&QPushButton::clicked,this,[=](){
QColor color = colorDialog->getColor(QColor(255,0,0));
qDebug()<<color.red();
qDebug()<<color.green();
qDebug()<<color.blue();
});
}
MainWindow::~MainWindow()
{
delete ui;
}

文件对话框 QFileDialog
⽂件对话框⽤于应⽤程序中需要打开⼀个外部⽂件或需要将当前内容存储到指定的外部⽂件。
打开⽂件(⼀次只能打开⼀个⽂件):getOpenFileName
打开多个⽂件(⼀次可以打开多个⽂件):getOpenFileNames
保存⽂件:getSaveFileName
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
#include <QPushButton>
#include <QFileDialog>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
QPushButton* btn = new QPushButton("文件",this);
connect(btn,&QPushButton::clicked,this,[=](){
QString path =QFileDialog::getOpenFileName(this,"文件","F:/封面","*.jpg");
qDebug()<<path;
});
}
MainWindow::~MainWindow()
{
delete ui;
}

字体对话框QFontDIalog
Qt 中提供了预定义的字体对话框类 QFontDialog,⽤于提供选择字体的对话框部件。
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
#include <QPushButton>
#include <QFontDialog>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
QPushButton* btn = new QPushButton("文字",this);
connect(btn,&QPushButton::clicked,this,[=](){
bool flag;
QFont font = QFontDialog::getFont(&flag,QFont("华文行楷",36));
qDebug()<<font.family();
qDebug()<<font.pointSize();
qDebug()<<font.bold();
qDebug()<<font.italic();
});
}
MainWindow::~MainWindow()
{
delete ui;
}

输入对话框QInputDialog
Qt中提供了预定义的输入对话框类:QInputDialog,用于临时数据输入的场合
-
双精度浮点型输入数据对话框:getDouble
-
整型输入数据对话款:getInt
-
选择条目型输入数据框:getItem
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
#include <QPushButton>
#include <QInputDialog>MainWindow::MainWindow(QWidget parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
QPushButton btn = new QPushButton("输入框",this);
connect(btn,&QPushButton::clicked,this,={
QStringList items;
items<<tr("spring")<<tr("summer")<<tr("Fall")<<tr("winter");
QString item = QInputDialog::getItem(this,"输入框","item",items);
qDebug()<<item;
});
}MainWindow::~MainWindow()
{
delete ui;
}
