`
ydbc
  • 浏览: 766918 次
  • 性别: 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掉自己了,不会再造成内存泄漏问题。

分享到:
评论

相关推荐

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

    本篇将详细讲解如何在Qt主界面中获取模态和非模态对话框的数据。 首先,让我们了解一下模态和非模态对话框的基本概念: 1. 模态对话框(Modal Dialog):当一个模态对话框打开时,用户必须先关闭该对话框才能继续...

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

    对话框有两种类型:模态(Modal)和非模态(Non-modal)。 模态对话框是那些在被显示时会阻塞其父窗口(通常为主界面)的操作,直到用户关闭该对话框为止。这种类型的对话框强制用户首先处理当前对话框,然后再继续...

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

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

    qml自定义模态对话框

    在QML(Qt Quick)中,自定义模态对话框是一种常见的需求,它允许开发者创建具有独特设计和功能的交互式界面元素。不同于标准的`Popup`组件,自定义模态对话框通常需要更高的定制性,以满足特定的用户体验或项目需求...

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

    总之,QT主界面调用模态对话框是通过创建QDialog子类、设计对话框布局、连接信号和槽以及在主界面中调用`exec()`方法来实现的。这不仅展示了QT的灵活性,还展示了其在构建用户交互界面方面的强大能力。学习并掌握这...

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

    本话题关注的是如何在关闭子模态对话框后刷新其父模态对话框,这是一个典型的前端开发问题,主要涉及到JavaScript和可能的框架如jQuery、React、Vue或Angular等。 首先,我们需要理解模态对话框的工作原理。模态...

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

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

    qml 弹出自定义窗口(模态对话框)

    在Qt Quick QML中,创建自定义窗口或者模态对话框是一种常见的需求,尤其是在开发具有用户交互性的桌面或移动应用时。QML提供了一种声明式编程的方式,使得UI设计和逻辑控制变得直观且灵活。下面我们将深入探讨如何...

    Qt模态对话框Demo

    在用户关闭模态对话框之前,主窗口和其他窗口将无法响应用户输入。 以下是如何创建和使用模态对话框的基本步骤: 1. **创建`QDialog`对象:** ```cpp QDialog *dialog = new QDialog(parent); ``` 这里,`...

    创建模态对话框--对话框

    这种特性使得模态对话框在需要用户输入关键信息或者进行确认操作的场景下非常有用。 创建模态对话框通常涉及以下几个步骤: 1. **设计对话框界面**:首先,你需要设计对话框的布局和外观,包括添加各种控件,如...

    Qt无边框对话框实现

    在本文中,我们将深入探讨如何在Qt环境中实现一个无边框对话框,同时保留系统边框功能,如拖拽移动、四边拖动大小调整、双击放大以及模态对话框的抖动效果。Qt是一个跨平台的应用程序开发框架,广泛应用于C++编程,...

    模态对话框与应用程序之间的数据交换

    4. Qt框架下的模态对话框: 在Qt中,`QDialog`类提供了`exec()`方法来显示模态对话框。数据交换可以通过信号和槽机制进行,这是Qt的一种强大的异步通信方式。当用户在对话框中做出改变时,可以发射信号,由主程序的...

    QT学习(3)-对话框,模态非模态,系统对话框,界面布局,其他控件

    QT学习(3)——对话框,模态非模态,系统对话框,界面布局,其他控件

    QT实例 基本对话框

    7. **对话框的模态和非模态** 模态对话框会阻塞用户对父窗口的交互,直到对话框被关闭。而非模态对话框则允许用户同时与对话框和其他窗口进行交互。在适当的情况下选择合适的对话框类型至关重要,以确保良好的用户...

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

    在QT中,`QDialog`类是模态对话框的基础,你可以通过继承`QDialog`创建自定义的模态对话框。例如,你可以创建一个`MyDialog`类,重写其`exec()`函数来实现模态对话框的行为。 其次,文件对话框(File Dialog)在很...

    qt 内建对话框

    - **父窗口**:大部分对话框都有一个父窗口,这会影响它们的模态行为(阻塞或非阻塞)以及关闭时的行为。通常,对话框会附加到其最近的顶级窗口上,但也可以通过传递父窗口指针来指定。 - **自定义布局**:虽然内建...

    qt 对话框的进阶.

    Qt对话框有两种模式:模态和非模态。模态对话框(默认)会阻止用户与对话框之外的其他窗口进行交互,直到对话框关闭。非模态对话框允许用户同时与多个窗口互动。你可以通过`setModal()`方法改变对话框的模式。 ```...

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

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

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

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

    非模态+打开我的电脑+对话框扩展.rar

    创建非模态对话框通常涉及编程技术,如在Windows API中使用CreateWindowEx函数,或者在现代UI框架如Qt、WPF或JavaFX中使用特定的对话框类。 2. 打开“我的电脑”功能:在Windows操作系统中,“我的电脑”(在较新的...

Global site tag (gtag.js) - Google Analytics