Qt学习五 - 对话框
一、对话框简介
开发桌面程序,总会需要使用对话框来实现短期任务或者简洁的交互。在Qt中,提供了QDialog类来实现对话框。在QDialog和其子类中,对parent指针有额外的解释:当parent为NULL时,对话框会作为一个顶层窗口,否则则会作为其父组件的子对话框(此时默认显示在父组件的中心位置)。可以新建一个项目,在主窗口上添加一个push button,然后在相应的槽函数中添加如下代码:
QDialog dlg;dlg.setWindowTitle("hello dialog !");dlg.exec();
运行程序查看效果,然后将其修改为:
QDialog dlg(this);dlg.setWindowTitle("hello dialog !");dlg.exec();
再运行程序,对比两次的差别。
对话框分为模态对话框和非模态对话框两种。模态对话框又分为应用级别的模态对话框和窗口级别的模态对话框。应用级别的模态对话框会阻塞同一应用下的所有窗口,当对话框出现时,用户先要和对话框进行交互,直到对话框关闭才可以和访问其他窗口;窗口级别的模态对话框只会阻塞与对话框相关联的窗口,允许用户与其他窗口进行交互;非模态对话框则与模态对话框相反,它不会阻塞用户与任何窗口的交互。
Qt中,实现应用级别的模态对话框使用QDialog::exec()函数,例如我们上面写的代码,实现窗口级别的模态对话框使用QDialog::open()函数,实现非模态对话框使用QDialog::show()函数。将上面的代码改为非模态对话框方式:
QDialog dlg;dlg.setWindowTitle("hello dialog !");dlg.show();
运行发现对话框一闪而过,这是因为对话框创建在栈上,并且show()函数不会阻塞当前线程,对话框显示后代码会继续向下执行,当执行完按钮的槽函数后,超出对话框的作用域,对话框就被析构了。所以需要将对话框创建在堆上,如下:
QDialog* dlg = new QDialog;dlg->setWindowTitle("hello dialog !");dlg->show();
创建在堆上就会涉及到释放内存,我们可以指定对话框的parent 为主窗口
QDialog* dlg = new QDialog(this);
但是这样如果主窗口不关闭,dialog就不会被销毁,内存会一直被占用。并且QWidget类的parent只能是QWidget的指针,如果对话框不是显示在界面类上怎么办?针对这个问题,我们可以设置QDialog的WindowAttribute
QDialog* dlg = new QDialog;dlg->setWindowTitle("hello dialog !");dlg->setAttribute(Qt::WA_DeleteOnClose);dlg->show();
这样当对话框关闭时会自动销毁,QObject类还有一个deleteLater()函数,该函数会在事件循环结束后销毁该对话框。
二、对话框数据传递
从模态对话框获取数据:
QDialog dlg;dlg.exec();qDebug() << dlg.result();
运行后,不会获取到结果,这是因为exec()(开启一个事件循环)会阻塞当前线程,当关闭对话框exec()函数返回时才会执行下面的代码,才可以获取到数据。如果设置了WA_DeleteOnClose,那么当对话框关闭时就会被销毁,就不能用这种方法获取数据了。exec()函数有两个返回值:QDialog::Accepted和QDialog::Rejected,通常我们会使用类似下面的代码:
QDialog dlg;if (dlg.exec() == QDialog::Accepted){//do something }else{//do something}
从非模态对话框获取数据:
因为QDialog::show()函数不会阻塞线程,show()会立即返回,所以不能通过上面的方式来获取数据,否则不等用户输入,已经执行了下面的代码。我们可以使用信号和槽机制,来获取数据。非模态对话框在关闭时可以调用QDialog::accept()或者QDialog::reject或者QDialog::done()函数,所以我们可以重写QDialog::accept()函数,在这里发送信号。也可以重写QDialog::closeEvent()函数来发送信号。然后在需要接受数据的窗口链接这个信号即可。
在QDialog子类中:
void UserAgeDialog::accept(){emit userAgeChanged(newAge); // newAge is an int QDialog::accept();}
在mainwindow中:
void MainWindow::showUserAgeDialog(){UserAgeDialog *dialog = new UserAgeDialog(this);connect(dialog, &UserAgeDialog::userAgeChanged, this, &MainWindow::setUserAge);dialog->show();}
void MainWindow::setUserAge(int age){userAge = age;}
三、标准对话框
标准对话框就是Qt内置的对话框,它们都是继承与QDialog类。打开帮助文档找到QDialog类,
可以看到当前版本Qt所支持的内置对话框。
- QColorDialog:选择颜色
- QErrorMessage:错误提示
- QFileDialog:选择文件
- QFontDialog:选择字体
- QinputDialog:允许用户输入一个值,并返回该值
- QMessageBox:模态对话框,用于提示信息,询问问题等
- QProgressDialog:显示操作过程
下面以QMessageBox为例,做个简单介绍,QMessageBox用于显示信息提示,我们通常会用到以下几个静态函数:
void about(QWidget * parent, const QString & title, const QString & text)
:显示关于对话框。这是一个最简单的对话框,其标题是 title,内容是 text,父窗口是 parent。对话框只有一个 OK 按钮。void aboutQt(QWidget * parent, const QString & title = QString())
:显示关于 Qt 对话框。该对话框用于显示有关 Qt 的信息。StandardButton critical(QWidget * parent, const QString & title, const QString & text, StandardButtons buttons = Ok, StandardButton defaultButton = NoButton)
:显示严重错误对话框。这个对话框将显示一个红色的错误符号。我们可以通过 buttons 参数指明其显示的按钮。默认情况下只有一个 Ok 按钮,我们可以使用StandardButtons
类型指定多种按钮。StandardButton information(QWidget * parent, const QString & title, const QString & text, StandardButtons buttons = Ok, StandardButton defaultButton = NoButton)
:QMessageBox::information()
函数与QMessageBox::critical()
类似,不同之处在于这个对话框提供一个普通信息图标。StandardButton question(QWidget * parent, const QString & title, const QString & text, StandardButtons buttons = StandardButtons( Yes | No ), StandardButton defaultButton = NoButton)
:QMessageBox::question()
函数与QMessageBox::critical()
类似,不同之处在于这个对话框提供一个问号图标,并且其显示的按钮是“是”和“否”两个。StandardButton warning(QWidget * parent, const QString & title, const QString & text, StandardButtons buttons = Ok, StandardButton defaultButton = NoButton)
:QMessageBox::warning()
函数与QMessageBox::critical()
类似,不同之处在于这个对话框提供一个黄色叹号图标。
我们通过以下示例来了解一下QMessageBox的简单使用:
if (QMessageBox::Yes == QMessageBox::question(this,"question","are you ok?",QMessageBox::Yes|QMessageBox::No,QMessageBox::Yes)){QMessageBox::information(this,"information","I'm glad to hear that");}else {QMessageBox::information(this,"information","i'm sorry");}
我们首先使用question来询问一个问题,然后根据用户点击的按钮不同作出相应的反应。QMessageBox类的static函数使用起来非常简单方便,如果我们需要进行定制QMessageBox,则可以通过设置其属性来实现。例如做一个询问是否需要保存的对话框:
//首先创建一个QMessagBox QMessageBox box;//设置对话框标题box.setText("The document has been modified");//设置对话框信息box.setInformativeText("Do you want to save your changes?");//设置详细信息,设置此属性,对话框会有一个show details的按钮,当点击该按钮时,显示详细信息box.setDetailedText("this is detail information");//设置对话框按钮box.setStandardButtons(QMessageBox::Save|QMessageBox::Discard|QMessageBox::Cancel);//设置对话框默认按钮 box.setDefaultButton(QMessageBox::Save);//显示对话框并接受返回值int ret = box.exec();//根据返回值不同,作出相应的操作switch (ret) {case QMessageBox::Save:qDebug() << "save";break;case QMessageBox::Discard:qDebug() << "discard";break;case QMessageBox::Cancel:qDebug() << "cancel";break;default:break;}
运行结果如下:
我这是在Mac下,如果是在windows下,那么Qt会自动将其设置为适应windows习惯的对话框。
转载于:https://www.cnblogs.com/wangcb/p/6675856.html
Qt学习五 - 对话框相关推荐
- C++桌面应用开发(Qt学习)——对话框(1)
对话框分类 : 模态对话框 弹出后不能操作其他窗口 阻塞 QDialog dlg(this) dlg.exec(); 需求:点击new按钮,弹出对话框 代码如下: ··· connect(ui-> ...
- Qt学习之对话框与主窗口的创建
Qt中的信号与槽机制 qt中槽和普通的C++成员函数几乎是一样的--可以是虚函数,可以被重载,可以是共有的,保护的或者私有的. 槽可以和信号连接在一起,在这种情况下,每当发射这个信号的信号,就会自动调 ...
- Qt学习(五):TCP通信
知识点 通信套接字和监听套接字 获取编辑器内容,发送到套接字 完整项目github地址: https://github.com/taw19960426/Qt_study/tree/main/QTcpT ...
- QT学习笔记(五):Qt5的8种标准对话框示例
QT学习笔记(五):Qt5的8种标准对话框示例 前言 实例展示 1.颜色对话框 2.文件对话框 3.字体对话框 4.输入对话框 5.消息对框 6.进度对话框 7.错误信息对话框 8.向导对话框. 前言 ...
- Qt学习之路(17): Qt标准对话框之QMessageBox
好久没有更新博客,主要是公司里面还在验收一些东西,所以没有及时更新.而且也在写一个基于Qt的画图程序,基本上类似于PS的东西,主要用到的是Qt Graphics View Framework.好了,现 ...
- QT学习:基本对话框
在QT的基本对话框中包括标准文件对话框.标准颜色对话框.标准字体对话框.标准输入对话框以及标准消息对话框,各种标准基本对话框通过调用各自不同的静态函数来完成其功能. 下图为标准基本对话框所需的静态函数 ...
- QT学习笔记之对话框
QT学习笔记之对话框 对话框是一种用户界面(窗口),它的主要功能是输出信息和接收用户的输入.在每个对话框内一般都有一些控件,对话框依靠这些控件与用户进行交互. 1) 模式对话框:用户只能与 ...
- QT学习 第一章:基本对话框--利用Qt Designer设计多个UI界面
QT学习 第一章:基本对话框--利用Qt Designer设计多个UI界面 效果截图: 创建上文件夹Designers,使用Designer设计三个UI界面: First.ui Second.ui T ...
- QT学习笔记(六)——QT弹出对话框并在主窗口调用对话框的信息
QT弹出对话框并在主窗口调用对话框的信息,显示影像 最近封控,大部分时间都在自己学习写代码,有点feel 了哈,自己摸出来一个简单的qt 界面,也实现了自己想要的功能.本篇博客主要记录一下,如何弹出对 ...
最新文章
- asp.net中DropDownList的SelectedIndexChanged触发问题
- linux 使用FIO测试磁盘iops
- python的learn_python_learn1
- 7-104 6翻了 (15 分)
- C++中宏的定义与用法(现已被内联函数所代替)
- Java并发(五)线程池使用番外-分析RejectedExecutionException异常
- ipmi 修改服务器密码,通过ipmi方式重设dell远程控制卡的密码
- 阿里开源 10 年,这封信里也有 Flink 的身影。
- 动态生成WizardPage
- matlab 产生瑞利信道,瑞利信道仿真 matlab
- a标签下载文件 自定义下载文件名
- 算法11 抓住波粒二象性的火星人
- 【TJOI 2019】唱、跳、rap和篮球
- R语言计算并合并各物种的OTU数量
- px rpx pt em rem单位
- 如何应对社会人,如何应对平淡的物质世界
- web前端培训课程有哪些?
- c语言魔王语言上机报告,魔王语言报告(带有完整程序).doc
- 计算机怎么关闭开机自启应用,如何关闭电脑开机自动启动的软件程序
- MySQL入门实战 一
热门文章
- qt vs 不出来dos窗口_VS嵌入QT后,建立QT工程后printf和cout无效,无法产生控制台应用程序窗口,需设置工程属性...
- threejs加载模型挤压变形_【技研】挤压铸造铝合金转向节开发
- java 跨域_springboot解决跨域CROS问题,用注解@CrossOrigin
- ==和equals的简单比较
- docker-compose 安装mysql
- linux测试网页装载时间,如何用Flood测试Web服务器响应时间
- 微博 用户画像_分析用户画像?从微博数据采集开始!
- 南召天气预报软件测试,南召天气预报15天
- php.ini centos,CentOS下修改php.ini后不生效的方法
- 全局变量中断原子操作_原子操作原理分析