`
chouchoulee
  • 浏览: 4228 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

QT模态对话框及非模态对话框

    博客分类:
  • QT
 
阅读更多
模态对话框(Modal Dialog)与非模态对话框(Modeless Dialog)的概念不是Qt所独有的,在各种不同的平台下都存在。又有叫法是称为模式对话框,无模式对话框等。 所谓模态对话框就是在其没有被关闭之前,用户不能与同一个应用程序的其他窗口进行交互,直到该对话框关闭。对于非模态对话框,当被打开时,用户既可选择和 该对话框进行交互,也可以选择同应用程序的其他窗口交互。

在Qt中,显示一个对话框一般有两种方式,一种是使用exec()方法,它总是以模态来显示对话框;另一种是使用show()方法,它使得对话框既可以模态显示,也可以非模态显示,决定它是模态还是非模态的是对话框的modal属性。

在Qt中,Qt的模态与非模态对话框选择是通过其属性modal来确定的。我们来看看modal属性,其定义如下:

modal : bool默认情况下,对话框的该属性值是false,这时通过show()方法显示的对话框就是非模态的。而如果将该属性值设置为true,就设置成了模 态对话框,其作用于把QWidget::windowModality属性设置为Qt::ApplicationModal。

而使用exec()方法显示对话框的话,将忽略modal属性值的设置并把对话框设置为模态对话框。

一般使用setModal()方法来设置对话框的modal属性。

我们总结一下设置对话框为模态的方法。

◆ 如果要设置为模态对话框,最简单的就是使用exec()方法,示例代码如下:

MyDialog myDlg;    myDlg.exec();也可以使用show()方法,示例代码如下:

MyDialog myDlg;    myDlg.setModal(true);    myDlg.show();

◆  如果要设置为非模态对话框,必须使用show()方法,示例代码如下:

MyDialog myDlg;    myDlg.setModal(false);
//或者
myDlg.setModal();
myDlg.show();
再次强调,目前有的朋友对于模态对话框和非模态对话框的认识有误解,认为使用show()方法显示的就是非模态对话框,这是不正确的。

小贴士:有时候,我们需要一个对话框以非模态的形式显示,但又需要它总在所有窗口的最前面,这时可以通过如下代码设置:

MyDialog myDlg;    myDlg.setModal(false);
//或者
myDlg.setModal();    myDlg.show();
//关键是下面这行
myDlg.setWindowFlags(Qt::WindowStaysOnTopHint);

在Qt中创建模态对话框,主要用到了QDialog的exec函数:
SonDialog dlg(this);
int res = dlg.exec();
if (res == QDialog::Accepted)
{
QMessageBox::information(this, “INFORMATION”, “You clicked OK button!”);
}
if (res == QDialog::Rejected)
{
QMessageBox::information(this, “INFORMATION”, “You clicked CANCEL button!”);
}
正如上面代码所显示的,可以通过exec函数的返回值来判断用户点击了哪个按钮使得模态对话框退出的,这可以使得我们能够根据用户的不同行为在推出退出模态对话框之后采取不同的处理方法。
在Qt中创建非模态对话框,主要用到了QDialog的show函数:
SonDialog *dlg;
dlg = new SonDialog(this);
dlg->show();
由上面代码,细心的读者可能就会问了,既然new了,如果不delete,那么内存不就存在了泄露的问题了吗?确实如此!所以,我们希望该Qt窗口在退出时自动能够delete掉自己,因此,我们在SonDialog的构造函数里,添加这样的一句代码:
setAttribute (Qt::WA_DeleteOnClose);
这样,我们的SonDialog就能够在它退出时自动的delete掉自己了,不会再造成内存泄漏问题。

原链:http://wangjiajun53880.blog.163.com/blog/static/11700139420110319573769/
分享到:
评论

相关推荐

    Qt主界面获取模态对话框数据的方法

    Qt主界面获取非模态对话框数据的方法

    子模态对话框关闭后刷新父模态对话框

    因系统需求,要在关闭子模态对话框后刷新父模态对话框,做的一个小测试。

    Qt模态对话框Demo

    模态对话框(Modal Dialog)是一种阻塞式对话框,当用户与对话框交互时,阻止用户与应用程序的其他部分进行交互。在用户关闭模态对话框之前,主窗口和其他窗口将无法响应用户输入。 以下是如何创建和使用模态对话框...

    QT主界面调用模态对话框示例程序

    QT主界面调用模态对话框示例程序源码程序,很详细希望可以帮到你

    Qt主界面获取非模态对话框数据的方法

    Qt主界面获取非模态对话框数据的方法。

    QT主界面调用非模态对话框编程源码

    QT主界面调用非模态对话框编程源码,和模态对话框对比

    Qt无边框对话框实现

    Qt无边框界面实现, 支持拖拽移动、四边拖动大小,双击放大等系统边框支持的功能,模态对话框支持抖动效果。

    MFC调用DLL文件中的对话框.非模态形式

    调用DLL文件中的对话框_一个DLL的能成功_一个DLL不能成功DllDialogTest VS2010写的 一个基于对话框的MFC程序 然后创建两个常规动态DLL文件 在DLL文件中分别添加对话框 ...均为非模态调用.... C++

    基于Qt的自定义对话框及其调用方法

    建立模态对话框,用于设置主窗口的表格行数和列数,并用于删除对话框对象,释放内存。 (2)设置表头标题 在对话框编辑表头标题后,主窗口获取编辑之后的表头标题,对话框以模态形式存在。 (3)定位单元格 在...

    QT对话框实例,各类对话框

    QT各种对话框实例,模态对话框,文件、颜色、字体、输入、消息框详细实例,本代码开发环境QT5.6.3

    Qt界面动态库被MFC对话框调用

    简介:本人学习Qt一个星期了,利用Qt做的仿360界面,然后打包成动态库。 用C++的MFC对话框按钮调用Qt界面动态库,经测试成功。

    MTDialog.zip

    Qt中模态对话框与非模态对话框的创建,可以供初学者学习

    自定义对话框实现综合案例

    qt框架下创建模态对话框和非模态对话框综合案列,对实际业务开发有一定的参考价值。

    Qt对话框QDialog相关练习代码

    1. 模态和非模态对话框 2. 多窗口切换 2.1 信号和槽 2.2 练习信号和槽例程 2.3 自定义对话框 3. 标准对话框 3.1 颜色对话框 3.2 文件对话框 3.3 字体对话框 3.4 输入对话框 3.5 消息对话框 3.6 进度对话框 3.7 错误...

    Qt学习教程之对话框消失动画效果

    主要给大家介绍了关于Qt学习教程之对话框消失动画效果的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    QDialog 对话框Demo

    非模态对话框允许用户同时与应用程序的其他部分进行交互。 2. **布局管理:** 可以使用布局管理器(如`QVBoxLayout`、`QHBoxLayout`等)来组织对话框中的控件。 3. **内建按钮:** `QDialog` 可以包含内建的标准...

    QT源代码 服务端 客户端

    qt中调用外部程序:QProcess的使用 qt下的模态和非模态对话框 QT透明效果等等

    Qt4编程.pdf

    7.5模态对话框与非模态对话框 7.6问题与解答 7.7总结与提高 第8章主窗口 8.1主窗口框架 8.2创建主窗口的方法和流程 8.2.1方法 8.2.2流程 8.3代码创建主窗口 8.3.1头文件 8.3.2实现文件 8.4使用QtDesigner创建主窗口...

    Qt&C++若干小工具类请自行取用

    - 非模态计时器窗口,使用QTime类对象currentTime与toString函数 - 模拟传送文件 - 使用QThread,在进度条对话框类中以成员变量的形式分发任务 `TransferTask* m_task;`,并在进度条对话框初始化函数中启用工作...

    Qt使用Mysql的API对数据库增删改查操作(十)

    经过(九)的驱动配置,我们可以正式来...#include//模态对话框的头文件 #include//lasterror用到的头文件 #include//新建表用到的头文件 Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget)

Global site tag (gtag.js) - Google Analytics