(14)对话框数据传递

简介: (14)对话框数据传递

模态对话框使用了exec()函数将其显示出来。exec()函数的真正含义是开启一个新的事件循环(我们会在后面的章节中详细介绍有关事件的概念)。所谓事件循环,可以理解成一个无限循环。Qt 在开启了事件循环之后,系统发出的各种事件才能够被程序监听到。这个事件循环相当于一种轮询的作用。既然是无限循环,当然在开启了事件循环的地方,代码就会被阻塞,后面的语句也就不会被执行到。因此,对于使用了exec()显示的模态对话框,我们可以在exec()函数之后直接从对话框的对象获取到数据值。

void MainWindow::open()
{
    QDialog dialog(this);
    dialog.setWindowTitle(tr("Hello, dialog!"));
    dialog.exec();
    qDebug() << dialog.result();
}

上面的代码中,我们使用exec()显示一个模态对话框。最后一行代码,qDebug()类似于std::cout或者 Java 的System.out.println();语句,将后面的信息输出到标准输出,一般就是控制台。使用qDebug()需要引入头文件。在exec()函数之后,我们直接可以获取到 dialog 的数据值。注意,exec()开始了一个事件循环,代码被阻塞到这里。由于exec()函数没有返回,因此下面的result()函数也就不会被执行。直到对话框关闭,exec()函数返回,此时,我们就可以取得对话框的数据。


需要注意的一点是,如果我们设置 dialog 的属性为WA_DeleteOnClose,那么当对话框关闭时,对象被销毁,我们就不能使用这种办法获取数据了。在这种情况下,我们可以考虑使用 parent 指针的方式构建对话框,避免设置WA_DeleteOnClose属性;或者是利用另外的方式。

实际上,QDialog::exec()是有返回值的,其返回值是QDialog::Accepted或者QDialog::Rejected。一般我们会使用类似下面的代码:

QDialog dialog(this);
if (dialog.exec() == QDialog::Accepted) {
    // do something
} else {
    // do something else
}

如果是非模态对话框,QDialog::show()函数会立即返回,如果我们也这么写,就不可能取得用户输入的数据。因为show()函数不会阻塞主线程,show()立即返回,用户还没有来得及输入,就要执行后面的代码,当然是不会有正确结果的。那么我们就应该换一种思路获取数据,那就是使用信号槽机制。


由于非模态对话框在关闭时可以调用QDialog::accept()或者QDialog::reject()或者更通用的QDialog::done()函数,所以我们可以在这里发出信号。另外,如果找不到合适的信号发出点,我们可以重写QDialog::closeEvent()函数,在这里发出信号。在需要接收数据的窗口(这里是主窗口)连接到这个信号即可。类似的代码片段如下所示:

//!!! Qt 5
// in dialog:
void UserAgeDialog::accept()
{
    emit userAgeChanged(newAge); // newAge is an int
    QDialog::accept();
}
 
// in main window:
void MainWindow::showUserAgeDialog()
{
    UserAgeDialog *dialog = new UserAgeDialog(this);
    connect(dialog, &UserAgeDialog::userAgeChanged, this, &MainWindow::setUserAge);
    dialog->show();
}
 
// ...
 
void MainWindow::setUserAge(int age)
{
    userAge = age;
}
相关文章
|
9月前
|
存储 关系型数据库 分布式数据库
PolarDB开源数据库进阶课18 通过pg_bulkload适配pfs实现批量导入提速
本文介绍了如何修改 `pg_bulkload` 工具以适配 PolarDB 的 PFS(Polar File System),从而加速批量导入数据。实验环境依赖于 Docker 容器中的 loop 设备模拟共享存储。通过对 `writer_direct.c` 文件的修改,替换了一些标准文件操作接口为 PFS 对应接口,实现了对 PolarDB 15 版本的支持。测试结果显示,使用 `pg_bulkload` 导入 1000 万条数据的速度是 COPY 命令的三倍多。此外,文章还提供了详细的步骤和代码示例,帮助读者理解和实践这一过程。
344 0
|
消息中间件 Java Spring
Spring Boot与JMS消息中间件的集成
Spring Boot与JMS消息中间件的集成
|
机器学习/深度学习 人工智能 小程序
AI赋能创意「logo生成器」带来全新体验!
在借助AI大模型背后先进的人工智能和深度学习算法,阿里云企航logo生成小程序为您提供智能化的设计体验。
2150 0
AI赋能创意「logo生成器」带来全新体验!
|
移动开发 弹性计算 前端开发
一个后端程序员如何被公司逼的开始写前端代码!奉劝各位最好选择前后端分离的公司
阿粉自从学会Java以来,一直都是在从事关于Java的开发,不论是换了几家公司,阿粉一直都是负责的关于后台的业务,很多都是前后端分离的,前端是写前端的代码,后端只负责逻辑实现和返回所需要的值,但是让人没想到的事发生了,公司前端临时被其他项目组调走,领导要求项目还要上线,阿粉不得不再次扮演全职员工上线。
一个后端程序员如何被公司逼的开始写前端代码!奉劝各位最好选择前后端分离的公司
|
程序员
程序员如何选择编程语言
程序员如何选择编程语言
206 0
程序员如何选择编程语言
|
机器学习/深度学习 文字识别 算法
【学习笔记】机器学习线性代数笔记(更新ing)
《Matrix Methods in Data Mining and Pattern Recognition》即在数据挖掘和模式识别中的矩阵论,分为三大模块:线代概念和矩阵分解、数据挖掘中的线代问题、计算矩阵分解(特征值和奇异值算法)。综合本书偏向应用,书中代码用matlab实现(当然也可以改用python写),课后练习题链接(https://archive.siam.org/books/fa04/ 感觉这本书还是比较老的 07年出版)
603 0
【学习笔记】机器学习线性代数笔记(更新ing)
|
XML 缓存 JSON
SpringBoot 系列教程(一百零六):SpringBoot封装企业通用Swagger配置
SpringBoot 系列教程(一百零六):SpringBoot封装企业通用Swagger配置
|
算法
连续向量最大和(一维模式识别)算法的分析与优化
输入:n个互相没有关联的数字(正负随机) 输出:该数组中连续数字的最大和     如在数组3 -4 5 2 -5 5 9 -9 -2 8中,连续数字最大和为5 2 -5 5 9这个数字序列的和,最大和为16 一、简单迭代算法     遇到这种问题,头脑中冒出的最直接最简单的就是这种算法。
920 0
|
自然语言处理
Mac原生字典支持的词典
一共十八部词典,见下: 打了一个包,有700多M,在CSDN没有权限上传这么大的文件,故上传到115上。 放到/Library/Dictionaries/目录中即可。 下载地址
1037 0