QT的exec函数

在Qt框架中,exec()方法是QDialog类(及其子类)的一个成员函数,用于以模态(modal)方式显示对话框。当exec()被调用时,它会启动一个局部的事件循环,这个循环会阻塞对对话框之外的其他窗口的访问,直到对话框被关闭。

exec()方法的返回类型通常是intQDialog::DialogCode(后者是一个枚举类型,提供了标准对话框结果的预定义值,如QDialog::AcceptedQDialog::Rejected)。返回的值通常用于指示对话框是如何被关闭的,例如用户点击了哪个按钮。

点击按钮打开新窗口

cpp 复制代码
void Widget::on_btnOpen_clicked(){
    SetDialog dlg;
    dlg.exec();
}

错误写法:窗口一闪而过

cpp 复制代码
void Widget::on_btnOpen_clicked(){
    SetDialog dlg;
    dlg.show();
    //dlg.exec();
}

在Qt框架中,对话框的显示方式通常有两种:模态(modal)和非模态(non-modal)。这两种方式的区别在于用户与对话框之外的其他窗口的交互能力。

  1. 模态对话框

    当使用exec()方法显示对话框时,它会以模态方式运行。这意味着在对话框关闭之前,用户不能与对话框之外的其他窗口进行交互。exec()方法会启动一个局部的事件循环,直到对话框被关闭,这个循环才会结束。因此,exec()是阻塞的,它会暂停代码的执行,直到对话框关闭。

  2. 非模态对话框

    当使用show()方法显示对话框时,它会以非模态方式运行。这意味着对话框显示后,用户仍然可以与对话框之外的其他窗口进行交互。show()方法不会启动新的事件循环,也不会阻塞代码的执行。因此,对话框的显示是即时的,而代码的执行会继续进行。

当你调用dlg.show()时,对话框会以非模态方式显示,用户可以与对话框和其他窗口进行交互。

如果你注释掉// dlg.exec();这一行,那么对话框将以非模态方式继续运行,这是符合预期的。但是,如果你取消注释并调用dlg.exec();,那么对话框会首先以非模态方式显示(因为show()已经被调用),然后exec()会尝试以模态方式运行对话框。这通常会导致一些不期望的行为,因为对话框已经显示了一次,而且exec()会再次进入事件循环等待对话框关闭。

相关推荐
uyeonashi34 分钟前
【Boost搜索引擎】构建Boost站内搜索引擎实践
开发语言·c++·搜索引擎
再睡一夏就好37 分钟前
从硬件角度理解“Linux下一切皆文件“,详解用户级缓冲区
linux·服务器·c语言·开发语言·学习笔记
TIF星空2 小时前
【使用 C# 获取 USB 设备信息及进行通信】
开发语言·经验分享·笔记·学习·microsoft·c#
Smile丶凉轩4 小时前
Qt 界面优化(绘图)
开发语言·数据库·c++·qt
reasonsummer4 小时前
【办公类-100-01】20250515手机导出教学照片,自动上传csdn+最大化、最小化Vs界面
开发语言·python
苏三福5 小时前
ros2 hunmle bag 数据包转为图片数据 python版
开发语言·python·ros2humble
qqxhb7 小时前
零基础学Java——第十一章:实战项目 - 桌面应用开发(JavaFX入门)
java·开发语言·javafx
大神薯条老师7 小时前
Python零基础入门到高手8.4节: 元组与列表的区别
开发语言·爬虫·python·深度学习·机器学习·数据分析
z人间防沉迷k7 小时前
堆(Heap)
开发语言·数据结构·笔记·python·算法
不二狗7 小时前
每日算法 -【Swift 算法】Two Sum 问题:从暴力解法到最优解法的演进
开发语言·算法·swift