我是靠谱客的博主 眼睛大小蚂蚁,最近开发中收集的这篇文章主要介绍QDialog执行exec()和show()的区别。,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

原文:http://blog.csdn.net/luoluo90428/article/details/6643003

1.如果使用exec()默认为模态的。如果用show()需要设置setModel(true)才是模态的。

2.当删除一个dialog对象时,exec()返回QDialog::Rejected,因此在删除dialog时要特别小心。举例说明一下:A 是一个QWidget 。B是一个QDialog,B = new QDialog(A)。

    int rec = B->exec();
    if (!thisDeleted)
    {
        if (rec == QDialog::Accepted)
            emit endSession();
    if (rec == QDialog::Rejected)
            emit endSession2();   
}

endSession()和 endSession2()都是A得成员函数。当删除A时,B也会删除(因为B得parent是A),这个时候exec()会返回 QDialog::Rejected,此时下面的 emit endSession2()还会继续执行,这个时候就会出现端错误了,因为A比B先删除,而此时还要调用A的成员,A都被删除了,还能调用其成员函数?要 是能调用就奇了怪了。因此在类A中多了个静态变量thisDeleted,记得在析构A的时候把这个值改变了,这样就不会在调用emit endSession2(),也就不会出现段错了。

3.exec()是一个循环时间函数,哪它什么时候才能返回了?当调用 accept()(返回QDialog::Accepted), reject()(返回QDialog::Rejected),done(int r)(返回r),close()(返回QDialog::Rejected),hide()(返回 QDialog::Rejected),destory()(返回QDialog::Rejected)。还有就是delete 自己的时候也会返回 QDialog::Rejected(destory()就会delete自己)。

当Qdialog设置了属性:setWindowFlags(Qt::FramelessWindowHint);去掉自带的title时,一定要加上属性Qt::Dialog,即:setWindowFlags(Qt::FramelessWindowHint|Qt::Dialog);,否则exec()将不会实现阻塞的作用,也就是父窗口仍然可以接受输入。

4.close()会销毁对象嘛。答案是只有当设置了 setAttribute(WA:closeOnDelelte)是才会删除,如果这个标志没有设置,其作用和hide(),setvisible(false)一样,只会隐藏改对象。


5.当dialog在exec()时候。后台线程同样可以操作界面,如收到每个消息,还可以弹出QDialog。

最后

以上就是眼睛大小蚂蚁为你收集整理的QDialog执行exec()和show()的区别。的全部内容,希望文章能够帮你解决QDialog执行exec()和show()的区别。所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(25)

评论列表共有 0 条评论

立即
投稿
返回
顶部