【Qt】对话框

目录

创建对话框

自定义对话框的方式

1.通过纯代码

[2.通过Qt Designer](#2.通过Qt Designer)

模态对话框与非模态对话框

Qt内置对话框

QMessageBox

1.消息对话框中的图标

2.消息对话框中的按钮

2.1标准按钮

2.2自定义按钮

QColorDialog

QFileDialog

QFontDialog

QInputDialog


对话框是GUI程序中不可缺的部分。一些不适合在主窗口中实现的功能组件可以设置在对话框中,对话框主要用于实现短期任务或简洁的用户交互。在实际开发中往往不是在项目创建时选择继承QDialog类,而是在项目代码中新创建一个类,让该类继承QDialog。

创建对话框

这里存在一个问题:我们创建的对话框是挂在了QMainWindow上,但是每次点击按钮就会创建一个对话框,只有当主窗口程序结束时这些对话框才会被随着对象树销毁,如果在一次程序执行后用户点击按钮的很多次那就会创建很多个对话框挂在对象树上,在内存空间小的设备上就会出现内存不够用的情况。

我们期望的是用户关闭对话框时,该对话框的占用的内存空间要被立即释放,才能避免出现上面的问题,因此我们我们可以通过对话框中的setAttribute方法设置一个属性:Qt::WA_DeleteOnClose表示对话框被关闭时,会自动delete它自己的内存空间。

自定义对话框的方式

实现以下功能:

通过点击主窗口中的按钮创建一个对话框,点击该对话框中的close按钮,该对话框关闭。

1.通过纯代码

继承QDialog创建新的类

首先我们要创建一个继承自QDialog的类:

然后就会生成一个dialog.h(Dialog类的声明)和dialog.cpp(Dialog类的实现)文件:

dialog.h文件:

dialog.cpp文件:

可以在dialog.cpp文件中实现要添加到对话框控件,可以把Dialog类看作一个之前的QWidget界面,向对话框中添加控件的操作和之前向窗口界面中添加操作是一样的。

mainwindow.cpp文件:

点击MainWindow界面上的按钮控件就会触发槽函数然后创建对话框,这里创建对话框是,可以将该对话框挂在对象树上,也可以不挂,分析这两种情况:

将对话框挂在对象树上:

此时如果可以不通过setAttribute方法设置对话框的属性,这个对话框也就被销毁了。

将对话框不挂在对象树上:

通过setAttribute方法设置对话框的属性,只有当我们关闭对话框的时,在堆上开辟的对话框内存空间才会被释放,就算主窗口被关闭了,创建出来的对话框也不会被释放。

2.通过Qt Designer

创建点击新建

可以看到会生成dialog.h和dialog.cpp文件以及dialog.ui文件,通过点击这个dialog.ui文件我们就可以通过界面的方式自定以对话框了。

通过图形界面方式(修改dialog.ui文件)向对话框中添加控件:

点击close对话框关闭,这个操作是在对话框上进行的,因此对应的槽函数也在dialog.cpp中:

在主窗口中创建对话框:

模态对话框与非模态对话框

modal:模式的。

模态对话框:阻塞式对话框。指调用QDialog::exec()函数显示出对话框,代码会在exec()函数这里阻塞直到对话框关闭,此时用户不可以和主窗口交互,只能和对话框交互,直到对话框关闭。(用于特别关键的情景,用户必须做出决策)

非模态对话框:非阻塞式对话框。指调用QDialog::show()函数显示出对话框,此时用户既可以和主窗口交互也可以和对话框交互。

Qt内置对话框

Qt中常用的内置对话框有:QMessageBox(消息对话框)、QColorDialog(颜色对话框)、QFileDialog(文件对话框)、QFontDialog(字体对话框)、QInputDialog(输入对话框)

这些对话框都继承自QDialog

QMessageBox

为用户提示重要信息,强制用户进行选择操作。

1.消息对话框中的图标

参数取值如下:

Question:用于正常操作过程中的提问。

Information:用于报告正常运行信息。

Warning:用于报告非关键错误。

Critiacl:用于报告严重错误。

2.消息对话框中的按钮

2.1标准按钮

参数的部分取值如下:

当在某种情况下弹出一个消息对话框,用户会选择该消息对话框中的一个按钮,通过用户选择的这个按钮,来触发后续功能,这里信号和槽是不可以的,因为标准按钮是无法进行信号槽连接的,那么我们怎么获取用户选择了那个标准按钮呢?

通过exec方法获得:

标准按钮是一个枚举类型的,且标准按钮是整数,可以通过exec方法的返回值来得到用户选择了哪一个标准按钮。

2.2自定义按钮

这里的参数role取值如下:

可以通过信号和槽的方式。

例子:

模态对话框,点击主窗口中的按钮,弹出一个消息对话框,该消息对话框中有标准按钮和自定义按钮,点击不同按钮会打印不同的信息。

如果要求消息对话框中仅有标准按钮,QMessageBox类提供了静态成员函数,帮我们创建消息对话框。

这些静态函数的返回值就是QMessageBox中的标准按钮的值,因此我们可以通过获取这些函数的返回值得到用户选择了那个标准按钮。

使用这些静态函数我们也不用关心内存释放问题,这些函数会自动释放创建的内存空间。

注意:使用该静态函数创建的对话框是模态的。

QColorDialog

颜色对话框是允许用户选择颜色。

创建和销毁颜色对话框的方式和上面的对话框是一样。这里只介绍QColorDialog提供的静态成员函数创建和显示颜色对话框:

参数:

initial:颜色对话框中默认选择的颜色。

parent:父控件。

title:颜色对话框的标题。

options:选项。

返回值:

一个Qcolor对象,该QColor对象的颜色值就是对话框中选择的颜色值。

例子:

将在颜色对话框中选择的颜色设为主窗口的背景色。

QFileDialog

文件对话框用于应用程序中打开一个文件,或将程序中的某些内容存储保存到文件中。

创建文件对话框的方式和上面对话框的创建方式一样,这里只介绍使用静态成员函数创建和显示文件对话框:

使用QFileDialog提供的静态成员函数创建文件对话框

参数:

caption:文件对话框的标题。

dir:默认打开的路径。

filter:文件过滤器。例如:如果filter的值是"*.cpp"那么弹出的文件对话框中的的文件就只显示以.cpp为后缀的文件。

注意:文件在文件对话框中并不会真正打开某文件和保存某文件,打开和保存文件这些功能都必须我们自己来实现。

QFontDialog

用于选择字体样式的对话框。

QFontDialog为我们提供了创建字体对话框的静态成员函数:

参数:

ok:是一个输出型参数,弹出的字体对话框中有两个按钮:OK和Cancel,如果点击OK那么参数ok就会被赋值为true,如果点击Cancel参数ok就会被赋值为false。

initial:初始化的QFont对象。

返回值:

一个QFont对象,如果点击字体对话框中的OK后该静态函数就会返回用户在字体对话框中选择的QFont对象,如果用户点击Cancel则会返回初始的QFont对象。

例子:

将主窗口中的按钮的字体样式设置为在文字对话框中选择的字体样式。

QInputDialog

参数:

items:是一个输入型参数,类型是QStringList,设置字符串对话框中的可供选择的字符串。

返回值:

如果用户点击输入对话框中的OK则返回再输入对话框中输入的内容,如果点击Cancel则返回初始值。

相关推荐
用户805533698034 天前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
xcyxiner4 天前
DicomViewer (vcpkg Windows和ubuntu编译)7
qt
Quz9 天前
QML Hello World 入门示例
qt
xcyxiner12 天前
DicomViewer (dcmtk读取dcm文件)5
qt
xcyxiner13 天前
DicomViewer (后台线程处理文件)4
qt
xcyxiner13 天前
DicomViewer (添加模型类)3
qt
xcyxiner14 天前
DicomViewer (目录调整) 2
qt
xcyxiner14 天前
dcmtk vtk vtk-dicom(gdcm) 编译(debug) v2
qt
LDR00616 天前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言
雪碧聊技术16 天前
Tree.js是什么?一文讲透
开发语言·javascript·ecmascript