QDialog是Qt中所有对话框窗口的基类

当QWidget无父组件的时候作为一个独立的窗口,有父组件的时候,将作为一个可见的部件嵌入到父组件里面。

QDialog不能作为子部件嵌入到其他容器中

对话框有模态、非模态两种情况。

模态对话框:

对于参数选择的对话框,一般用模态对话框;

显示后不能够和父窗口进行交互

是一种阻塞式对话框调用

模态对话框通过调用exec()函数实现,使用模态对话框时,事件就在对话框内部循环,必须将对话框关闭才能继续执行主界面的操作。

非模态:

对于显示或查看某些内容的对话框,一般用非模态对话框。

显示后独立存在可以同时与父窗口进行交互

非阻塞式对话框调用

非模态对话框调用show()函数实现

最后一个小技巧是设置该属性表示关闭对话框的同时删除对话框对象  就会将自己给释放不会导致内存泄漏

实例:创建一个面向对象的窗口,自己创建类class Dialog : public QDialog

#include <QApplication>
#include <QWidget>
#include <QDialog>
#include <QDebug>
#include "Dialog.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Dialog dlg;
dlg.show();
return a.exec();
}

.h

#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
#include <QPushButton>
class Dialog : public QDialog
{
Q_OBJECT
protected:
QPushButton ModalBtn;
QPushButton NormalBtn;
QPushButton MixedBtn;
protected slots:
void ModalBtn_Clicked();
void NormalBtn_Clicked();
void MixedBtn_Clicked();
public:
Dialog(QWidget *parent = );
~Dialog();
};
#endif // DIALOG_H

cpp

#include "Dialog.h"
#include <QDebug>
Dialog::Dialog(QWidget *parent) :
QDialog(parent), ModalBtn(this), NormalBtn(this), MixedBtn(this)
{
ModalBtn.setText("Modal Dialog");
ModalBtn.move(, );
ModalBtn.resize(, );
NormalBtn.setText("Normal Dialog");
NormalBtn.move(, );
NormalBtn.resize(, );
MixedBtn.setText("Mixed Dialog");
MixedBtn.move(, );
MixedBtn.resize(, );
connect(&ModalBtn, SIGNAL(clicked()), this, SLOT(ModalBtn_Clicked()));
connect(&NormalBtn, SIGNAL(clicked()), this, SLOT(NormalBtn_Clicked()));
connect(&MixedBtn, SIGNAL(clicked()), this, SLOT(MixedBtn_Clicked()));
resize(, );
}
void Dialog::ModalBtn_Clicked()
{
qDebug() << "ModalBtn_Clicked() Begin";
QDialog dialog(this);
dialog.exec();
// done(Accepted);
qDebug() << "ModalBtn_Clicked() End";
}
void Dialog::NormalBtn_Clicked()
{
qDebug() << "NormalBtn_Clicked() Begin";
QDialog* dialog = new QDialog(this);//如定义为栈 QDialog dialog ; dialog->show();会一闪而过 也就是说对话框显示至桌面时,依然会继续往下运行,运行到函数的末尾(这个是消息映射函数)局部变量就被销毁了,所以对话框就消失了 如果是在堆上,销毁的只是指向这个堆对象的指针,堆对象不会被销毁,对话框就不糊消失了
dialog->setAttribute(Qt::WA_DeleteOnClose);//设置该属性即可在让在该窗口关闭时就可以释放堆上的内存了不会造成泄漏
dialog->show();
// done(Rejected);
qDebug() << "NormalBtn_Clicked() End";
}
void Dialog::MixedBtn_Clicked()//混合的对话框
{
qDebug() << "MixedBtn_Clicked() Begin";
QDialog* dialog = new QDialog(this);//指定父组件this
dialog->setAttribute(Qt::WA_DeleteOnClose);
dialog->setModal(true);//设置非模态对话框的行为类似模态对话框 为混合对话框
dialog->show();
// done(100);
qDebug() << "MixedBtn_Clicked() End";
}
Dialog::~Dialog()
{
qDebug() << "~Dialog()";
}

对话框的返回值:

只有模态对话框才具有返回值(因为模态对话框用于选择的)

模态对话框返回值用于表示交互结果

实际应用中就是根据用户的操作exec得到不同的结果值,根据这些值判断做出相应的操作(进入不同的处理函数)

当删除一个dialog对象时,exec()返回QDialog::Rejected,因此在删除dialog时要特别小心。

#include <QtGui/QApplication>
#include <QWidget>
#include <QDialog>
#include <QDebug>
#include "Dialog.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Dialog dlg;
int r = dlg.exec();//将Dialog 设置为模态对话框,程序运行到这一行就会阻塞了
if( r == QDialog::Accepted )
{
qDebug() << "Accepted";
}
else if( r == QDialog::Rejected )
{
qDebug() << "Rejected";
}
else
{
qDebug() << r;
} return r;// 如果将一个对话框一模态对话框的模式运行返回值需要时r;; //如果直接返回a.exec()就进入了两次消息循环,其实就是进入消息循环 当关闭窗口的时候应用程序不会结束了 所以返回值需要时r;
}

.c

#include "Dialog.h"
#include <QDebug>
Dialog::Dialog(QWidget *parent) :
QDialog(parent), ModalBtn(this), NormalBtn(this), MixedBtn(this)
{
ModalBtn.setText("Modal Dialog");
ModalBtn.move(, );
ModalBtn.resize(, );
NormalBtn.setText("Normal Dialog");
NormalBtn.move(, );
NormalBtn.resize(, );
MixedBtn.setText("Mixed Dialog");
MixedBtn.move(, );
MixedBtn.resize(, );
connect(&ModalBtn, SIGNAL(clicked()), this, SLOT(ModalBtn_Clicked()));
connect(&NormalBtn, SIGNAL(clicked()), this, SLOT(NormalBtn_Clicked()));
connect(&MixedBtn, SIGNAL(clicked()), this, SLOT(MixedBtn_Clicked()));
resize(, );
}
void Dialog::ModalBtn_Clicked()
{
qDebug() << "ModalBtn_Clicked() Begin"; done(Accepted);
qDebug() << "ModalBtn_Clicked() End";
}
void Dialog::NormalBtn_Clicked()
{
qDebug() << "NormalBtn_Clicked() Begin"; done(Rejected);
qDebug() << "NormalBtn_Clicked() End";
}
void Dialog::MixedBtn_Clicked()
{
qDebug() << "MixedBtn_Clicked() Begin";
done();
qDebug() << "MixedBtn_Clicked() End";
}
Dialog::~Dialog()
{
qDebug() << "~Dialog()";
}

其中void QDialog::​done(int r)函数一直不理解 也没有找到说清楚的博客

最可靠的还是到帮助文档:

void QDialog::​done(int r)//设置返回值关闭对话框

Closes the dialog and sets its result code to r. If this dialog is shown with exec(), done() causes the local event loop to finish, and exec() to return r.

隐藏模式对话框并且设置结果代码为r

狄泰学院第17课 - 对话框及其类型笔记

http://blog.csdn.net/xgy_123/article/details/22219639

http://www.kuqin.com/qtdocument/qdialog.html

Qt对话框QDialog的更多相关文章

  1. Qt之对话框QDialog

    这一节主要讲述对话框类,先讲述两种不同类型的对话框,再介绍Qt提供的几个标准对话框.对应本节的内容,可以在帮助索引中查看 QDialog 和 Dialog Windows 关键字. 一.模态和非模态对 ...

  2. C/C++ -- Gui编程 -- Qt库的使用 -- 对话框QDialog

    模态对话框 -----源文件main.cpp(工程QtDialog)----- #include "qtdialog.h" #include <QApplication> ...

  3. Qt 对话框显示控制按钮

    在对话框窗体构造函数加入 SystemDialog::SystemDialog(QWidget *parent) : QDialog(parent), ui(new Ui::SystemDialog) ...

  4. QT对话框模式与非模式

    QT模态对话框及非模态对话框 非模态对话框(Modeless Dialog)的概念不是模态对话框就是在其没有被关闭之前,用户不能与同一个应用程序的其他窗口进行交互,直到该对话框关闭.对于在模态来显示对 ...

  5. QT对话框设计

    软件和系统:QTcreator5.7,win8.1 1. 首先新建项目,选择application中的Qt widgets application. 2. 创建类Dialog,选择QDialog作为基 ...

  6. Qt对话框_模态/非模态

    对话框在Qt GUI应用程序中有着广泛的用途,对话框有模态.非模态两种情况. 对于参数选择的对话框,一般用模态对话框:对于显示或查看某些内容的对话框,一般用非模态对话框. 对话框类QDialog,官方 ...

  7. QT对话框中show和exec的区别

    转自:http://hi.baidu.com/wangjuns8/blog/item/24b382460dd1c1338694737d.html QDialog的显示有两个函数show()和exec( ...

  8. 19.QT对话框(文件对话框,颜色对话框,字体框,自定义对话框)

    文件对话框 #include<QFileDialog> //文件对话框 void Dialog::on_pushButton_clicked() { //定义显示文件的类型 窗口标题 可供 ...

  9. Qt对话框之二:模态、非模态、半模态对话框

    一.模态对话框 模态对话框:阻塞同一应用程序中其它可视窗口输入的对话框.模态对话框有自己的事件循环,用户必须完成这个对话框中的交互操作,并且关闭了它之后才能访问应用程序中的其它任何窗口. 显示模态对话 ...

随机推荐

  1. ES6学习笔记之Promise

    入职百度EFE团队实习已经三周了,实习中接触到了生产环境的技术和开发流程,大开眼界,和自己在学校接小作坊式项目是很不一样的体验.其中一个很大的感触是,ES6早已不是“选修”的尝鲜技术,而是已经全面普及 ...

  2. OSI 7层模型

    协议:电脑与电脑通信之间的一种“约定”ois模式1,物理层2. 数据链路层3. 网络层4. 传输层5. 会话层6. 表示层7. 应用层发email为例 应用层:从用户输入完成所要发送的内容并点击“发送 ...

  3. php 微信支付jsapi

    首先你们公司开通微信支付功能后,会收到一份邮件,里面有账户相关信息,一般有:微信支付商户号,商户平台登录帐号,商户平台登录密码,申请对应的公众号,公众号APPID. 1.下载demo:用上面信息登陆& ...

  4. 学渣也要搞 laravel(2)—— HTTP路由[1]篇

    前几天忙了,然后快两个星期没有发博客.今天正式回归.哈哈 1. 路由 说到路由当时学的时候给我疑惑了几天..没有仔细看文档.然后一脸蒙蔽的去用 postman[谷歌插件] 测试路由方法.然后就很奇怪 ...

  5. python 简单谈谈“类”

    文章出处:http://www.cnblogs.com/winstic/,请保留此连接 面向对象是python语言的一大特色,而类又是面向对象编程的核心 先来一段关于类的声明: class myCla ...

  6. 基于page的简单页面推送技术

    我们可以先看下简单效果,打开2个页面可以看到推送效果 服务端我们只需要下面一个方法 using System; using System.Collections.Generic; using Syst ...

  7. JAVA面试题相关基础知识

        1.面向对象的特征有哪些方面 ①抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节 ...

  8. 000webhost找不到文件自定义错误

    1.新建一个名为.htaccess的文本文件:2.在文件中输入如下代码:ErrorDocument 404 /404.php3.保存文件,将.htaccess上传到域名的根目录,再验证,呵呵,成功了! ...

  9. 总结Web应用中基于浏览器的安全漏洞

    ‍‍‍‍‍1.浏览器缓存 每次打开一个网站,网页的内容会缓存到用户的机器中.如果这些内容在其他网页中需要重新加载,浏览器加载的是缓存,而不是再次下载内容.如果一些Web应用商店以及显示用户敏感信息(比 ...

  10. iOS获取图片的Base64String,兼容Android,java,web,jpg(jpeg),png

    呃呃呃……需求的来源又是同学,对!又是! 废话不哆嗦,怎么把一张图在iOS上转一个Base64String出来,稍微了解的,或者随便搜一下,都能搞定一大堆,但是!!!! 自己(iOS)转自己用,完全没 ...