QT对话框及其属性
Qt中使用QDialog类表示对话框
对话框是一个顶层窗口,出现在程序最上层,用于实现短期任务或者简洁的用户交互
QDialog也是继承自QWidget,可以使用QWidget接口
Qt常用的内置对话框有:
对话框 | 说明 |
QFiledialog | 文件对话框 |
QColorDialog | 颜色对话框 |
QFontDialog | 字体对话框 |
QInputDialog | 输入对话框 |
QMessageBox | 消息框 |
例:
创建文件时选择继承自QDialog
创建好后直接运行
比QMainWindow和QWidget窗口多一个?,没有最小化,最大化
实际开发中一般不会直接在创建项目时将文件创建为基础自QDialog----一般不将主窗口作为一个对话框,而是在代码中创建额外的类,让额外的类继承自QDialog
例
在主窗口中通过点击一个按钮来弹出对话框,将主窗口设置为继承自QMainWindow
在ui界面创建一个PushButton
转到PushButton的clicked信号的槽函数进行实现,实现点击按钮后弹出对象框
若将对话框关闭后,再次点击按钮,又会弹出新的对话框,每次弹出的对话框是同一个吗?
不是,每次将对话框关闭后,再次点击按钮都又重新进行创建
因此在程序运行过程中,会创建除无数个对话框,造成内存泄漏,虽然将父元素设置为this,添加到对象树中,会自动销毁,但在窗口退出前不会销毁,也就是说当程序退出之前可能同时存在很对对话框
解决方法:
在用户点击对话框的关闭按钮时,触发delete将对话框销毁
通过QDialog提供的setAttribute(Qt::WA_DeleteOnClose)进行设置其属性,使对话框在关闭时自动delete
自定义对话框内容
继承自QDialog创建类
纯代码方式:
在ui界面创建一个PushButton
转到PushButton的clicked信号的槽函数进行实现自定义对话框,通过创建文件中的创建C++类实现
自定义类名,指定父类
创建好后多出一个头文件和cpp文件
在头文件中声明Dialog.h,对构造函数进行修改,使其能指定父元素
同时在dialog.cpp文件修改构造函数的定义,使其能指定父元素
在mainwindow.cpp文件包含dialog.h,定义pushbutton槽函数,创建自定义的dialog,进行大小,自动delete,弹出的设置
此时就能通过点击按钮弹出对话框
再在dialog.cpp构造函数处实现对话框的自定义,实现添加对话框控件
能够显示添加到对话框的控件,但是位置都在初始位置,通过布局管理器进行管理,在dialog头文件中声明handle,将pushbutton的信号槽进行连接,实现槽函数
在图形化界面创建自定义对话框
创建文件继承自QMainWindow,进入ui界面创建一个QPushButton
再创建一个文件---Qt的ui文件及对应的类
创建好后就有两个ui文件
在dialog.ui进行自定义对话框
转到对话框的按钮的clicked槽函数实现关闭对话框
再转到窗口的ui界面转到打开对话框按钮的clicked槽函数,实现打开对话框,及对话框初始化,需包含dialog.h
model---bool
模态/非模态,为true时是模态,为false时是非模态
模态:弹出对话框时,用户无法操作父窗口,必须完成对话框内部的操作,关闭对话框之后才能操作父窗口
非模态:弹出对话框后,用户可以操作父窗口
上面写的对话框都是非模态的,弹出对话框后,可以通过点击父窗口按钮弹出多个对话框
如:
如何产生模态对话框?
将show()操作替换为exec(),弹出的对话框就为模态对话框
此时就无法产生多个对话框
消息对话框
QMessageBox---QDialog的子类
消息对话框时应用程序中最常用的界面元素,主要用于为用户提示重要信息,强转用户进行选择操作
QMessageBox类中定义了静态成员函数,可以直接调用不同风格的消息对话框
图标格式 | 说明 |
NoIcon | 无图标 |
Information | 消息图标 |
Warning | 提醒图标 |
Critical | 严重图标 |
Question | 问题图标 |
内置按钮 |
NoButton |
Ok |
Save |
SaveAll |
Open |
Yes |
YesToAll |
No |
NoToAll |
Abort |
Retry |
Ignore |
Close |
Cancel |
Discard |
Help |
Apply |
Reset |
RestoreDefaults |
消息对话框是模态的
例:
在ui界面创建一个按钮,实现点击按钮弹出消息对话框
转到按钮的clicked的槽函数进行实现
在消息对话框添加自定义按钮
通过QMessageBox的addButton接口进行添加
addButton(const QAbstractButton* button,ButtonRole role);
第一个参数就是PushButton,第二个参数ButtonRole
ButtonRole
采用枚举类型,表示接收/拒绝等含义
通过信号槽实现相关操作
也可以通过用户点击按钮后的返回值来判断用户点击了什么按钮来实现对应操作
如:
直接通过QMessageBox提供的静态函数创建对话框
在ui界面创建一个按钮
转到按钮的clicked信号的槽函数进行实现
同样通过接收返回值来判断是点击了哪个按钮来执行对应操作
此处使用的是warning的静态函数
也可以使用Information,Critical,Question
颜色对话框
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对象 |
getColor是一个静态函数,无需创建对话框对象,可以直接调用
例:
通过按钮弹出对话框
在ui界面创建一个按钮,转到他的clicked槽函数,调用静态函数进行颜色对话框弹出
返回值是QColor类型
可以使用返回的QColor类型,通过QSS的方式设置背景颜色
也可以使用sprintf的方式进行字符串拼接
文件对话框
QFileDialog文件对话框用于应用程序需要打开一个外部文件或将当前内容存储到指定的外部文件
常用方法
方法 | 说明 |
QString getOpenfileName() | 打开文件,一次只能代开一个文件 |
QStringList getopenFileNames() | 一次打开多个文件 |
QString getSaveFileName() | 保存文件 |
例:
在ui界面创建两个按钮,一个实现打开文件,一个保存文件,转到槽函数进行实现
点击按钮就能实现弹出相应的文件管理器
点击文件进行打开后,就能获取到文件的完整路径
通过文件路径实现相应操作,需要额外实现
输入文件名,点击保存后,也是获得文件路径
而不是真的保存了,需要额外实现
字体对话框
QFontDialog字体对话框是Qt中提供的预定义的字体对话框类,用于提供选择字体的对话框部件
常用静态函数
使用时第一个参数为bool类型的指针,作为输出型参数,打开对话框后,若点击的是ok则bool类型的指针为true,若点击cancel则bool类型指针为false
例:
在ui界面创建一个pushbutton,实现其clicked槽函数,点击button弹出字体对话框
使用静态函数弹出字体对话框
当设置字体相关属性,返回的font就设置了对应属性,点击ok则返回bool指针为true
此时就可以通过font将设置的字体设置进文本
如设置进pushButton的文本
输入对话框
QInputDialog输入对话框,是Qt中提供的预定义的输入对话框类,用于进行临时数据输入,允许用户输入一个具体的数据---整数,浮点数,字符串等
常用方法
方法 | 说明 |
doublle getDouble() | 双精度浮点型输入数据对话框 |
int getInt() | 整形输入数据对话框 |
getItem() | 条目输入数据对话框 |
例:
在ui界面创建一个按钮,定义其clicked信号的槽函数,实现打开整数输入对话框
可以通过键盘输入,也可以通过微调框进行微调
再在ui界面创建一个按钮,实现打开浮点数输入对话框
再在ui界面创建一个按钮,实现打开字符串输入对话框
通过QStringList创建输入条目
返回值为选择的条目被输入的内容