Qt 窗口是通过 QMainWindow类 来实现的
QMainWindow
是⼀个为用户提供主窗⼝程序的类,继承自QWidget
类,并且提供了⼀个预定义的布局。QMainWindow
包含 ⼀个菜单栏(menu bar)、多个⼯具栏(tool bars)、多个浮动窗⼝(铆接部件)(dock widgets)、⼀个状态栏(status bar) 和⼀个 中⼼部件(central widget),它是许多应用程序的基础,如文本编辑器,图片编辑器等。如下图为 QMainwindow 中 各组件所处的位置:
一.菜单栏
Qt 中的菜单栏是通过 QMenuBar 这个类来实现的。⼀个主窗口最多只有⼀个菜单栏。位于主窗口顶部、主窗口标题栏下面。
菜单栏中包含菜单. 菜单中包含菜单项
1.1 创建菜单栏
方法一:
菜单栏的创建可以借助于 QMainWindow类 提供的 menuBar() 函数来实现。**menubar()**函数原型如下:
QMenuBar * menuBar() const
方法二:堆上动态创建
创建菜单,并通过 QMenu 提供的 addMenu() 函数 来添加菜单。
//先创建一个菜单栏
QMenuBar* menubar = new QMenuBar(this);
//将菜单栏放入窗口中
this->setMenuBar(menubar);
使用 setMenuBar 把菜单栏放到窗口中.
1.2 在菜单栏中添加菜单
创建菜单,并通过 QMenu 提供的 addMenu() 函数 来添加菜单。
//先创建一个菜单栏
QMenuBar* menubar = new QMenuBar(this);
//将菜单栏放入窗口中
this->setMenuBar(menubar);
//创建菜单
QMenu*menu1 = new QMenu("文件");
QMenu*menu2 = new QMenu("编辑");
QMenu*menu3 = new QMenu("视图");
//添加到菜单中
menubar->addMenu(menu1);
menubar->addMenu(menu2);
menubar->addMenu(menu3);
运行程序即可看到
1.3 添加菜单项
在 Qt 中,并没有专门的菜单项类,可以通过 QAction 类,抽象出公共的动作。如在菜单中添加菜单项
QAction
可以给菜单栏使⽤, 也可以给工具栏使用.
//给菜单添加菜单项
QAction* action1= new QAction("新建");
QAction* action2= new QAction("打开");
QAction* action3= new QAction("保存");
QAction* action4= new QAction("另存为");
QAction* action5= new QAction("退出");
menu1->addAction(action1);
menu1->addAction(action2);
menu1->addAction(action3);
menu1->addAction(action4);
menu1->addAction(action5);
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/ca34f410c591476ab099dca49bffcbca.png)
1.4 在菜单项之间添加分割线
在菜单项之间可以添加分割线。分割线如下图所示,添加分割线是通过 QMenu 类 提供的addSeparator()
函数来实现;
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QDebug>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
//先创建一个菜单栏
QMenuBar* menubar = new QMenuBar(this);
//将菜单栏放入窗口中
this->setMenuBar(menubar);
//创建菜单
QMenu*menu1 = new QMenu("文件");
QMenu*menu2 = new QMenu("编辑");
QMenu*menu3 = new QMenu("视图");
menubar->addMenu(menu1);
menubar->addMenu(menu2);
menubar->addMenu(menu3);
//给菜单添加菜单项
QAction* action1= new QAction("新建");
QAction* action2= new QAction("打开");
QAction* action3= new QAction("保存");
QAction* action4= new QAction("另存为");
QAction* action5= new QAction("退出");
menu1->addAction(action1);
menu1->addSeparator();//添加分割线
menu1->addAction(action2);
menu1->addAction(action3);
menu1->addAction(action4);
menu1->addAction(action5);
//添加信号槽
connect(action1,&QAction::triggered,this,&MainWindow::handl);
connect(action5,&QAction::triggered,this,&QMainWindow::close);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::handl()
{
qDebug()<<"出发新建操作";
}
1.5 给菜单项添加快捷键
QMenu*num4= new QMenu("关于(&A)");
通过 (&X)即可 X表示任意字母
在键盘上按下Alt+A
即可
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
//创建菜单栏
QMenuBar*menuBar =new QMenuBar();
this->setMenuBar(menuBar);
//创建菜单
QMenu*num1= new QMenu("文件(&F)");
QMenu*num2= new QMenu("编辑(&E)");
QMenu*num3= new QMenu("视图(&v)");
QMenu*num4= new QMenu("关于(&A)");
menuBar->addMenu(num1);
menuBar->addMenu(num2);
menuBar->addMenu(num3);
menuBar->addMenu(num4);
//创建菜单项
QAction*action1 = new QAction("菜单项1");
QAction*action2 = new QAction("菜单项2");
QAction*action3 = new QAction("菜单项3");
QAction*action4 = new QAction("菜单项4");
num1->addAction(action1);
num2->addAction(action2);
num3->addAction(action3);
num4->addAction(action4);
QAction* aci1= new QAction("子菜单");
}
MainWindow::~MainWindow()
{
delete ui;
}
1.5 给菜单项添加槽函数使快捷键生效
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<qDebug>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
QMenuBar*menuBar = new QMenuBar();
this->setMenuBar(menuBar);
QMenu*menu1 =new QMenu("文件(&F)");
QMenu*menu2 =new QMenu("视图(&V)");
menuBar->addMenu(menu1);
menuBar->addMenu(menu2);
//创建四个菜单项
QAction*action1 = new QAction("action1 (&Q)");
QAction*action2 = new QAction("action2 (&W)");
QAction*action3 = new QAction("action3 (&E)");
QAction*action4 = new QAction("action4 (&R)");
menu1->addAction(action1);
menu1->addAction(action2);
menu2->addAction(action3);
menu2->addAction(action4);
//如果不绑定槽函数,快捷键没用
connect(action1,&QAction::triggered,this,&MainWindow::handle1);
connect(action2,&QAction::triggered,this,&MainWindow::handle2);
connect(action3,&QAction::triggered,this,&MainWindow::handle3);
connect(action4,&QAction::triggered,this,&MainWindow::handle4);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::handle1()
{
qDebug()<<"handle1";
}
void MainWindow::handle2()
{
qDebug()<<"handle2";
}
void MainWindow::handle3()
{
qDebug()<<"handle3";
}
void MainWindow::handle4()
{
qDebug()<<"handle4";
}
1.5 给某个菜单项添加子菜单
QMenuBar
可以通过addMenu
添加
Qmenu
可以通过addMenu
添加
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
QMenuBar* bar =new QMenuBar();
this->setMenuBar(bar);
QMenu* men1 = new QMenu("父菜单");
QMenu*men2 =new QMenu("子菜单");
bar->addMenu(men1);
men1->addMenu(men2);
QAction *act1 = new QAction("菜单项1");
QAction *act2 = new QAction("菜单项2");
men2->addAction(act1);
men2->addAction(act2);
QMenu *act3 = new QMenu("z菜单");
men2->addMenu(act3);
}
MainWindow::~MainWindow()
{
delete ui;
}
1.6 给某个菜单项添加图标
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
// QMenuBar* menuBar = new QMenuBar();
QMenuBar* menuBar = this->menuBar();//如果QMenuBar存在,直接获取并返回,不存在,先创建新的在返回
this->setMenuBar(menuBar);
QMenu*menu =new QMenu("菜单");
menu->setIcon(QIcon(":/open.png"));
menuBar->addMenu(menu);
QAction*actio1 = new QAction("菜单项1");
actio1->setIcon(QIcon(":/open.png"));
QAction*actio2 = new QAction("菜单项2");
actio2->setIcon(QIcon(":/open1.png"));
menu->addAction(actio1);
menu->addAction(actio2);
}
MainWindow::~MainWindow()
{
delete ui;
}
1.7 综合示例
在窗口上创建⼀个菜单栏,在菜单栏中添加⼀些菜单,在某⼀个菜单中添加⼀些菜单项。
新建 Qt 项目
注意:此时新建项⽬时选择的基类 QMainwindow ,如下图示:
- 创建⼀个菜单栏, ⼀个菜单.
- 两个菜单项: 保存, 加载
- 创建⼀个 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);
// 创建中央控件
edit = new QTextEdit(this);
this->setCentralWidget(edit);
edit->setPlaceholderText("此处编写⽂本内容...");
}
给 action 添加⼀些动作
// 连接信号槽, 点击 action 时触发⼀定的效果.
connect(action1, &QAction::triggered, this, &MainWindow::save);
connect(action2, &QAction::triggered, this, &MainWindow::load);
实现这两个槽函数
-
使用QFileDialog 来实现选择⽂件的效果.
- getSaveFileName ⽤于保存⽂件的场景. 此时的对话框可以输⼊文件名. - getOpenFileName ⽤于打开⽂件的场景. 此时的对话框可以获取到鼠标选择的⽂件名.
-
搭配 C++ 标准库的文件操作实现文件读写.
void MainWindow::save()
{
// 弹出对话框, 选择写⼊⽂件的路径
QFileDialog* dialog = new QFileDialog(this);
QString fileName = dialog->getSaveFileName(this, "保存⽂件", "C:/Users/1/");
qDebug() << "fileName: " << fileName;
// 写⼊⽂件
std::ofstream file(fileName.toStdString().c_str());
if (!file.is_open()) {
qDebug() << "⽂件保存失败!";
return;
}
const QString& text = edit->toPlainText();
file << text.toStdString();
file.close();
}
void MainWindow::load()
{
// 弹出对话框, 选择打开的⽂件
QFileDialog* dialog = new QFileDialog(this);
QString fileName = dialog->getOpenFileName(this, "加载⽂件", "C:/Users/1/");
qDebug() << "fileName: " << fileName;
// 读取⽂件
std::ifstream file(fileName.toStdString().c_str());
if (!file.is_open()) {
qDebug() << "⽂件加载失败!";
return;
}
std::string content;
std::string line;
while (std::getline(file, line)) {
content += line;
content += "\n";
}
file.close();
// 显⽰到界⾯上
QString text = QString::fromStdString(content);
edit->setPlainText(text);
}
执行程序, 可以看到此时就可以通过程序来保存/加载文件了. 并且对⽂件进⾏编辑
二.工具栏
⼯具栏是应⽤程序中集成各种功能实现快捷键使⽤的⼀个区域。可以有多个,也可以没有,它并不是应用程序中必须存在的组件。它是⼀个可移动的组件,它的元素可以是各种窗口组件,它的元素通常以图标按钮的⽅式存在。如下图为⼯具栏的示意图:
2.1创建工具栏
调用 QMainWindow类 的 addToolBar() 函数来创建工具栏,每增加⼀个⼯具栏都需要调用⼀次该函数。
如添加两个工具栏
- 添加菜单栏,使用 的示
setMenuBar
- 菜单栏只能有一个,不能重复设置
- 添加工具栏,使用的示
addToolBar
- 工具栏可以有多个
1.2 创建工具栏并添加图标
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QDebug>
#include<QToolBar>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
//创建菜单栏
QMenuBar*mebubar =this->menuBar();
this->setMenuBar(mebubar);
//创建菜单
QMenu *menu =new QMenu("文件");
mebubar->addMenu(menu);
//工具兰手动创建出来的,自动不会创建出来
QToolBar* toolbar = new QToolBar();
this->addToolBar(toolbar);
//创建两个菜单项
QAction*action1 = new QAction("保存");
QAction*action2 = new QAction("打开");
action1->setToolTip("点击这里保存文件");
action2->setToolTip("低级这里打开文件");
//菜单放到菜单中
menu->addAction(action1);
menu->addAction(action2);
//菜单放到工具栏中
toolbar->addAction(action1);
action1->setIcon(QIcon(":/Payara.png"));
toolbar->addAction(action2);
action2->setIcon(QIcon(":/Payara.png"));
connect(action1,&QAction::triggered,this,&MainWindow::handl1);
connect(action2,&QAction::triggered,this,&MainWindow::handl2);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::handl1()
{
qDebug()<<"handl1";
}
void MainWindow::handl2()
{
qDebug()<<"handl2";
}
如果
QAction
即使Qmenu
的子元素,又是QToolBar
的子元素,释放的时候不会重复delete
,只会释放一次
1.3 设置停靠位置
工具栏停靠位置的设置有两种方式。⼀种是在创建工具栏的同时指定停靠的位置,另⼀种是通过QToolBar类提供的setAllowedAreas()函数来设置
方式一:创建工具栏的同时指定其停靠的位置。
在创建⼯具栏的同时,也可以设置⼯具栏的位置,其默认位置是在窗口的最上面;如上述代码,默认
在最上面显示。工具栏允许停靠的区域由 QToolBar类 提供的 allowAreas()函数 决定,其中可以设置的位置包括
- Qt::LeftToolBarArea 停靠在左侧
- Qt::RightToolBarArea 停靠在右侧
- Qt::TopToolBarArea 停靠在顶部
- Qt::BottomToolBarArea 停靠在底部
- Qt::AllToolBarAreas 以上四个位置都可停靠
使用 QToolBar类 提供的 setAllowedAreas()函数 设置停靠位置
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QToolBar>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
//创建两个工具栏
QToolBar*toolBar1 = new QToolBar();
QToolBar*toolBar2 = new QToolBar();
this->addToolBar(toolBar1);
this->addToolBar(Qt::LeftToolBarArea,toolBar2);
//可以设置在左边,也可以在右边
toolBar2->setAllowedAreas(Qt::LeftToolBarArea|Qt::RightToolBarArea);
//设置不可以浮动
toolBar2->setFloatable(false);
//设置不允许移动
toolBar2->setMovable(false);
QAction*action1 = new QAction("动作1");
QAction*action2 = new QAction("动作2");
QAction*action3 = new QAction("动作3");
QAction*action4 = new QAction("动作4");
toolBar1->addAction(action1);
toolBar1->addAction(action2);
toolBar2->addAction(action3);
toolBar2->addAction(action4);
}
MainWindow::~MainWindow()
{
delete ui;
}
说明
:在创建⼯具栏的同时指定其停靠的位置,指的是程序运行时工具栏默认所在的位置;而使用setAllowedAreas()函数设置停靠位置,指的是⼯具栏允许其所能停靠的位置。
1.4 设置浮动属性
工具栏的浮动属性可以通过 QToolBar类 提供的 setFloatable()函数 来设置。setFloatable()函数原型为:
void setFloatable (bool floatable)
参数:
- true:浮动
- false : 不浮动
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QToolBar>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
//创建两个工具栏
QToolBar*toolBar1 = new QToolBar();
QToolBar*toolBar2 = new QToolBar();
this->addToolBar(toolBar1);
this->addToolBar(Qt::LeftToolBarArea,toolBar2);
//可以设置在左边,也可以在右边
toolBar2->setAllowedAreas(Qt::LeftToolBarArea|Qt::RightToolBarArea);
//设置不可以浮动
toolBar2->setFloatable(false);
//设置不允许移动
toolBar2->setMovable(false);
QAction*action1 = new QAction("动作1");
QAction*action2 = new QAction("动作2");
QAction*action3 = new QAction("动作3");
QAction*action4 = new QAction("动作4");
toolBar1->addAction(action1);
toolBar1->addAction(action2);
toolBar2->addAction(action3);
toolBar2->addAction(action4);
}
MainWindow::~MainWindow()
{
delete ui;
}
三.状态栏
状态栏是应⽤程序中输出简要信息的区域。⼀般位于主窗⼝的最底部,⼀个窗⼝中最多只能有⼀个状态栏。在 Qt 中,状态栏是通过 QStatusBar类 来实现的。 在状态栏中可以显示的消息类型有:
- 实时消息:如当前程序状态
- 永久消息:如程序版本号,机构名称
- 进度消息:如进度条提⽰,百分百提示
3.1状态栏的创建
- 状态栏的创建是通过 QMainWindow 类 提供的 statusBar() 函数来创建;
- 在状态栏中显⽰实时消息是通过 showMessage() 函数来实现,
- 在状态栏中可以显⽰永久消息,此处的永久消息是通过 标签 来显示的;
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QLabel>
#include<QProgressBar>
#include<QPushButton>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
//存在就获取,不存在就创建
QStatusBar*statusbar = this->statusBar();
this->setStatusBar(statusbar);
//显示临时信息
// statusbar->showMessage("这是一个消息",3000);//3000毫秒,就是3秒后消息自动消失
//第二个参数timeout参数为0,消息就会持久存在
// statusbar->showMessage("这是一个消息");
QLabel*label = new QLabel("这是一个QLabel");
statusbar->addWidget(label);
// QLabel*label2 = new QLabel("这是一个Qlabel2");
// statusbar->addWidget(label2,2);
QProgressBar* processbar= new QProgressBar();
processbar->setRange(0,100);
processbar->setValue(50);
statusbar->addWidget(processbar);
QPushButton* button = new QPushButton("按钮");
statusbar->addPermanentWidget(button);
}
MainWindow::~MainWindow()
{
delete ui;
}
四.浮动窗口
在 Qt 中,浮动窗⼝也称之为铆接部件。浮动窗口是通过QDockWidget类 来实现浮动的功能。浮动窗口⼀般是位于核心部件的周围,可以有多个
4.1浮动窗口的创建
浮动窗⼝的创建是通过 QDockWidget类 提供的构造⽅法 QDockWidget()函数 动态创建的;示例如下:
QDockWidget* dockwidget =new QDockWidget();
//QDockWidget方法,把浮动窗口加入到子窗口中
this->addDockWidget(Qt::LeftDockWidgetArea,dockwidget);
4.2设置停靠的位置
浮动窗⼝是位于中心部件的周围。可以通过 QDockWidget类 中提供 setAllowedAreas() 函数设置其允许停靠的位置。其中可以设置允许停靠的位置有:
- Qt::LeftDockWidgetArea 停靠在左侧
- Qt::RightDockWidgetArea 停靠在右侧
- Qt::TopDockWidgetArea 停靠在顶部
- Qt::BottomDockWidgetArea 停靠在底部
- Qt::AllDockWidgetAreas 以上四个位置都可停靠
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QDockWidget>
#include<QLabel>
#include<QPushButton>
#include<QVBoxLayout>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
//给主窗口添加一个子窗口
QDockWidget* dockwidget =new QDockWidget();
//QDockWidget方法,把浮动窗口加入到子窗口中
this->addDockWidget(Qt::LeftDockWidgetArea,dockwidget);
//浮动窗口也可以设置标题
dockwidget->setWindowTitle("这是一个浮动窗口");
//浮动窗口内部添加一些其他控件
//不能直接给这个窗口添加子控件,而需要创建一个单独的QWidget,把要添加的控件插入到QWidget中
//然后把QWidget设置到dockWidget中
QWidget*container = new QWidget();
dockwidget->setWidget(container);
//创建布局管理器,把布局管理器设置到Qwidget中
QVBoxLayout*layout = new QVBoxLayout;
container->setLayout(layout);
//创建其他控件
QLabel*label = new QLabel("这是一个QLabel");
QPushButton*button = new QPushButton("这是一个按钮");
layout->addWidget(label);
layout->addWidget(button);
//设置浮动窗口允许停靠的位置
dockwidget->setAllowedAreas(Qt::LeftDockWidgetArea|Qt::TopDockWidgetArea);
}
MainWindow::~MainWindow()
{
delete ui;
}
五.对话框
5.1 对话框介绍
对话框是 GUI 程序中不可或缺的组成部分。⼀些不适合在主窗⼝实现的功能组件可以设置在对话框中。对话框通常是⼀个顶层窗⼝,出现在程序最上层,⽤于实现短期任务或者简洁的⽤⼾交互。Qt常⽤的内置对话框有:QFiledialog(⽂件对话框)、QColorDialog(颜⾊对话框)、QFontDialog(字体对话框)、QInputDialog (输⼊对话框)QMessageBox(消息框)
5.2 对话框的分类
对话框分为 模态对话框 和 非模态对话框。
5.2.1 模态对话框
模态对话框指的是:显示后无法与父窗口进进交互,是⼀种阻塞式的对话框。使⽤ QDialog::exec() 函数 调用。
模态对话框适用于必须依赖用户选择的场合,比如消息显示,文件选择,打印设置等。
示例 创建一个按钮弹出对话框
QDaillog是QWidget的子类,Qwidget的属性方法,QDaillog也可以使用
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QDialog>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
QDialog*dialog = new QDialog(this);
dialog->setWindowTitle("这是对话框得标题");
//设置尺寸
dialog->resize(400,400);
//通过show方法可以显示出对话框
dialog->show();
// delete dialog;//delete在这对话框会出现一闪而过的情况
//把delete和关闭按钮得点击信号连接起来
//用户点击关闭得时候触发delete
//通过设置属性完成上述描述
dialog->setAttribute(Qt::WA_DeleteOnClose);//关闭时自动进行delete
}
5.2.1 非模态对话框
非模态对话框显示后独立存在,可以同时与父窗口进行交互,是⼀种非阻塞式对话框,使用 QDialog::show() 函数调用。
⾮模态对话框⼀般在堆上创建,这是因为如果创建在栈上时,弹出的⾮模态对话框就会⼀闪⽽过。同时还需要设置Qt:WA_DeleteOnClose 属性,⽬的是:当创建多个⾮模态对话框时(如打开了多个非模态窗⼝),为了避免内存泄漏要设置此属性
5.3 Qt 内置对话框
Qt 提供了多种可复用的对话框类型,即 Qt 标准对话框。Qt 标准对话框全部继承于 QDialog类。常用标准对话框如下:
5.3.1 消息对话框 QMessageBox
消息对话框是应⽤程序中最常用的界面元素。消息对话框主要⽤于为用户提示重要信息,强制用户进行选择操作
QMessageBox类 中定义了静态成员函数,可以直接调用创建不同风格的消息对话框,其中包括:
Question | 用于正常操作过程中的提问 |
Information | 用于报告正常运⾏信息 |
Warning | 用于报告非关键错误 |
Critical | 用于报告严重错误 |
示例1:问题提示消息对话框
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QMessageBox>
#include<QDebug>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
//创建QMessageBox
QMessageBox* messageBox = new QMessageBox(this);
messageBox->setWindowTitle("对话框窗口标题");
messageBox->setText("这是对话框得文本");
messageBox->setIcon(QMessageBox::Warning);
messageBox->setStandardButtons(QMessageBox::Ok|QMessageBox::Save|QMessageBox::Cancel);
// QPushButton* button =new QPushButton("按钮",messageBox);
// messageBox->addButton(button,QMessageBox::AcceptRole);
//connect 连接信号槽,针对当前点击得按钮进行相关得操作
//弹出非模态对话框
// messageBox->show();
//弹出模态对话框。当对话框处于弹出状态的时候,代码就会在exec阻塞,一直到对话框被关闭
int result = messageBox->exec();
if(result == QMessageBox::Ok)
{
qDebug()<<"ok";
}else if (result == QMessageBox::Save) {
qDebug()<<"Save";
}else if (result == QMessageBox::Cancel) {
qDebug()<<"Cancel";
}
// delete messageBox;
messageBox->setAttribute(Qt::WA_DeleteOnClose);
}
示例2:问题提示消息对话框
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QMessageBox>
#include<QDebug>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
int result = QMessageBox::warning(this,"对话框标题","对话框文本",QMessageBox::Ok|QMessageBox::Cancel);
if(result == QMessageBox::Ok)
{
qDebug()<< "ok";
}
else if (result == QMessageBox::Cancel) {
qDebug()<<"Cancel";
}
}
使用QMessageBox::critical
使用QMessageBox::information弹出对话框
5.3.1 颜⾊对话框 QColorDialog
颜色对话框的功能是允许用户选择颜色。继承自 QDialog 类。颜色对话框如下图示:
常用方法介绍:
- QColorDialog (QWidget *parent = nullptr) //创建对象的同时设置⽗对象
- QColorDialog(const QColor &initial, QWidget *parent = nullptr) //创建对象的同时通过QColor对象设置默认颜⾊和⽗对象
- void setCurrentColor(const QColor &color) //设置当前颜⾊对话框
- QColor currentColor() const //获取当前颜⾊对话框
- QColor getColor(const QColor &initial = Qt::white, QWidget *parent = nullptr, const QString&title = QString(),QColorDialog::ColorDialogOptions options = ColorDialogOptions()) //打开颜色选择对话框,并返回⼀个QColor对象
- void open(QObject *receiver, const char *member) //打开颜⾊对话框
参数说明
1. initial:设置默认颜⾊
2. parent:设置父对象
3. title:设置对话框标题
4. options:设置选项
示例1 点击按钮弹出颜色对话框
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QColorDialog>
#include<QDebug>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
QColor color = QColorDialog::getColor(QColor(0,255,0),this,"选择颜色");
qDebug()<<color;
//基于用户选择的颜色,修改窗口的背景色
// QString style = "background-color:rgb("+QString::number(color.red())+","+QString::number(color.green())
// +"," + QString::number(color.blue())+");";
// this->setStyleSheet(style);
char style[1204] = {0};
sprintf(style,"background-color: rgb(%d, %d, %d);",color.red(),color.green(),color.blue());
this->setStyleSheet(style);
}
getColor
: 这个函数就能弹出一个模态对话框,用户选择颜色后点击确定,对话框关闭, getColor返回值就是给用户选择的颜色值
5.3.2 文件对话框 QFileDialog
⽂件对话框用于应用程序中需要打开⼀个外部⽂件或需要将当前内容存储到指定的外部⽂件。
常用方法介绍:
- 打开文件(⼀次只能打开⼀个文件)
QString getOpenFileName(QWidget *parent = nullptr, const QString &caption = QString(), const
QString &dir = QString(), const QString &filter = QString(), QString *selectedFilter = nullptr,
QFileDialog::Options options = Options())
- 打开多个文件(⼀次可以打开多个文件)
QStringList getOpenFileNames(QWidget *parent = nullptr, const QString &caption = QString(),
const QString &dir = QString(), const QString &filter = QString(), QString *selectedFilter = nullptr,
QFileDialog::Options options = Options())
- 保存文件
QString getSaveFileName(QWidget *parent = nullptr, const QString &caption = QString(), const
QString &dir = QString(), const QString &filter = QString(), QString *selectedFilter = nullptr,
QFileDialog::Options options = Options())
参数说明
- 参数1:parent 父亲
- 参数2:caption 对话框标题
- 参数3:dir 默认打开的路径
- 参数4:filter 文件过滤器
示例:打开文件
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QFileDialog>
#include<QDebug>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
QString filePath= QFileDialog::getOpenFileName(this);
qDebug()<<filePath;
}
void MainWindow::on_pushButton_2_clicked()
{
QString filePath= QFileDialog::getSaveFileName(this);
qDebug()<<filePath;
}
5.3.2 字体对话框 QFontDialog
Qt 中提供了预定义的字体对话框类 QFontDialog,用于提供选择字体的对话框部件。
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QFontDialog>
#include<QtDebug>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
bool ok = false;
QFont font = QFontDialog::getFont(&ok);
qDebug()<<"ok = "<<ok;
//qDebug()<<font;
qDebug()<<font.family();
qDebug()<<font.pointSize();
qDebug()<<font.bold();
qDebug()<<font.italic();
ui->pushButton->setFont(font);
}
5.3.5 输入对话框 QInputDialog
Qt 中提供了预定义的输⼊对话框类:QInputDialog,用于进行临时数据输⼊的场合。
常用方法介绍:
- 双精度浮点型输⼊数据对话框
double getDouble (QWidget *parent, const QString &title, const QString &label, double
value = 0, double min = -2147483647, double max = 2147483647, int decimals = 1, bool *ok
= nullptr, Qt::WindowFlags flags = Qt::WindowFlags());
- 整型输⼊数据对话框
int getInt (QWidget *parent, const QString &title, const QString &label, int value = 0, int
min = -2147483647, int max = 2147483647, int step = 1, bool *ok = nullptr, Qt::WindowFlags
flags = Qt::WindowFlags());
- 选择条目型输入数据框
QString getItem (QWidget *parent, const QString &title, const QString &label, const
QStringList &items, int current = 0, bool editable = true, bool *ok = nullptr,
Qt::WindowFlags flags = Qt::WindowFlags(), Qt::InputMethodHints inputMethodHints =
Qt::ImhNone) ;
参数说明:
- parent:父亲
- title:对话框标题
- label:对话框标签
- items:可供选择的条目
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QInputDialog>
#include<QDebug>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
int result = QInputDialog::getInt(this,"整数输入一个对话框","请输入一个整数:");
qDebug()<<result;
}
void MainWindow::on_pushButton_2_clicked()
{
double result = QInputDialog::getInt(this,"浮点数输入对话框","请输入一个浮点数:");
qDebug()<<result;
}
void MainWindow::on_pushButton_3_clicked()
{
QStringList items;
items.push_back("111");
items.push_back("222");
items.push_back("333");
items.push_back("444");
QString item = QInputDialog::getItem(this,"条目输入对话框","请输入条目:",items);
qDebug()<<item;
}
六. QT窗口小结
QT窗口程序
- 菜单栏(QMenuBar) -->菜单(QMenu)–>菜单项(QAction)
- 工具栏(QToolBar)(有多个)->菜单项(QActio)
- 状态栏(QStatusBar)->QWidget
- 子窗口(QDockWidget)->Qwidget->放置其他控件
- 对话框(QDialog)->自己手动继承的方式,针对QDialog进行扩展