一、对话框简介

开发桌面程序,总会需要使用对话框来实现短期任务或者简洁的交互。在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学习五 - 对话框相关推荐

  1. C++桌面应用开发(Qt学习)——对话框(1)

    对话框分类 : 模态对话框 弹出后不能操作其他窗口 阻塞 QDialog dlg(this) dlg.exec(); 需求:点击new按钮,弹出对话框 代码如下: ··· connect(ui-> ...

  2. Qt学习之对话框与主窗口的创建

    Qt中的信号与槽机制 qt中槽和普通的C++成员函数几乎是一样的--可以是虚函数,可以被重载,可以是共有的,保护的或者私有的. 槽可以和信号连接在一起,在这种情况下,每当发射这个信号的信号,就会自动调 ...

  3. Qt学习(五):TCP通信

    知识点 通信套接字和监听套接字 获取编辑器内容,发送到套接字 完整项目github地址: https://github.com/taw19960426/Qt_study/tree/main/QTcpT ...

  4. QT学习笔记(五):Qt5的8种标准对话框示例

    QT学习笔记(五):Qt5的8种标准对话框示例 前言 实例展示 1.颜色对话框 2.文件对话框 3.字体对话框 4.输入对话框 5.消息对框 6.进度对话框 7.错误信息对话框 8.向导对话框. 前言 ...

  5. Qt学习之路(17): Qt标准对话框之QMessageBox

    好久没有更新博客,主要是公司里面还在验收一些东西,所以没有及时更新.而且也在写一个基于Qt的画图程序,基本上类似于PS的东西,主要用到的是Qt Graphics View Framework.好了,现 ...

  6. QT学习:基本对话框

    在QT的基本对话框中包括标准文件对话框.标准颜色对话框.标准字体对话框.标准输入对话框以及标准消息对话框,各种标准基本对话框通过调用各自不同的静态函数来完成其功能. 下图为标准基本对话框所需的静态函数 ...

  7. QT学习笔记之对话框

    QT学习笔记之对话框 对话框是一种用户界面(窗口),它的主要功能是输出信息和接收用户的输入.在每个对话框内一般都有一些控件,对话框依靠这些控件与用户进行交互. 1)       模式对话框:用户只能与 ...

  8. QT学习 第一章:基本对话框--利用Qt Designer设计多个UI界面

    QT学习 第一章:基本对话框--利用Qt Designer设计多个UI界面 效果截图: 创建上文件夹Designers,使用Designer设计三个UI界面: First.ui Second.ui T ...

  9. QT学习笔记(六)——QT弹出对话框并在主窗口调用对话框的信息

    QT弹出对话框并在主窗口调用对话框的信息,显示影像 最近封控,大部分时间都在自己学习写代码,有点feel 了哈,自己摸出来一个简单的qt 界面,也实现了自己想要的功能.本篇博客主要记录一下,如何弹出对 ...

最新文章

  1. asp.net中DropDownList的SelectedIndexChanged触发问题
  2. linux 使用FIO测试磁盘iops
  3. python的learn_python_learn1
  4. 7-104 6翻了 (15 分)
  5. C++中宏的定义与用法(现已被内联函数所代替)
  6. Java并发(五)线程池使用番外-分析RejectedExecutionException异常
  7. ipmi 修改服务器密码,通过ipmi方式重设dell远程控制卡的密码
  8. 阿里开源 10 年,这封信里也有 Flink 的身影。
  9. 动态生成WizardPage
  10. matlab 产生瑞利信道,瑞利信道仿真 matlab
  11. a标签下载文件 自定义下载文件名
  12. 算法11 抓住波粒二象性的火星人
  13. 【TJOI 2019】唱、跳、rap和篮球
  14. R语言计算并合并各物种的OTU数量
  15. px rpx pt em rem单位
  16. 如何应对社会人,如何应对平淡的物质世界
  17. web前端培训课程有哪些?
  18. c语言魔王语言上机报告,魔王语言报告(带有完整程序).doc
  19. 计算机怎么关闭开机自启应用,如何关闭电脑开机自动启动的软件程序
  20. MySQL入门实战 一

热门文章

  1. qt vs 不出来dos窗口_VS嵌入QT后,建立QT工程后printf和cout无效,无法产生控制台应用程序窗口,需设置工程属性...
  2. threejs加载模型挤压变形_【技研】挤压铸造铝合金转向节开发
  3. java 跨域_springboot解决跨域CROS问题,用注解@CrossOrigin
  4. ==和equals的简单比较
  5. docker-compose 安装mysql
  6. linux测试网页装载时间,如何用Flood测试Web服务器响应时间
  7. 微博 用户画像_分析用户画像?从微博数据采集开始!
  8. 南召天气预报软件测试,南召天气预报15天
  9. php.ini centos,CentOS下修改php.ini后不生效的方法
  10. 全局变量中断原子操作_原子操作原理分析