qt reject函数和close哪个好

不知道标题该怎么取了,文中就简单整理一下下面几个函数吧。因为不断有网友问到此类问题(包括相关问题),所以,自己整理一下,也算学习小结了。
这些函数分两类,一类是用来删除对象的(从内存中干掉),一类是用来隐藏窗口的(从界面上干掉)
QObject::deleteLater()
QWidget::setVisible(bool)
使得Widget可见或不可见
QWidget::setHidden(bool)
QWidget::show()
QWidget::hide()
QWidget::close()
视情况确定是否调用4号0号
QDialog::done(int)
始终会调用4号,视情况调用0号
QDialog::accept()
QDialog::reject()
我们知道,
分配到heap中的对象(通过 new),当对其delete,才会被析构。分配在stack中的对象,当其离开作用域是被析构
在 Qt 中,一般建议你使用 new 的方式创建对象。或者,你可以看看&
本文接下来的讨论,都是假定你用的 new 创建的对象。
从Qt类的祖宗开始吧。因为QObject不涉及界面啊,成员中只涉及析构问题。在 一文中,我们知道,
obj-&deleteLater();
最后调用的就是:
很简单哈。所以,这个函数的谈论(略)
另外:对象析构时会发射 destroyed 信号。注意,是对象析构时,这是句废话,但要记住。
setVisible
呵呵,show()、hide()、setVisible()、setHidden() 这4个函数让人看得眼花缭乱。怎么办?
看看代码吧:
virtual void setVisible(bool visible);
inline void setHidden(bool hidden) { setVisible(!hidden); }
inline void show() { setVisible(true); }
inline void hide() { setVisible(false); }
代码很清楚:这四个东西之中,只有 setVisible 是独立的,其他三个都是它的马甲!
setVisible 的作用是什么呢?顾名思义,使得一个Widget可见或不可见。
要点:不可见,是Widget不在界面上显示,但不代表对象被析构!
这个函数,Manual中给的其实很详细的,很透彻。但一开始想弄明白还真是不容易。
首先,我们直接调用close时(或者点击关闭按钮调用),它会生成 QCloseEvent 事件:(我们可以选择接受或阻止它,如果我们阻止事件,close将直接返回,什么都不做)
看点源码:
bool QWidgetPrivate::close_helper(CloseMode mode)
if (mode == CloseWithSpontaneousEvent)
QApplication::sendSpontaneousEvent(q, &e);
QApplication::sendEvent(q, &e);
if (!that.isNull() && !e.isAccepted()) {
data.is_closing = 0;
其次:如果我们接受了事件(默认),她就直接调用我们前面提到的朋友。(从界面上干掉)
q-&hide();
再次:如果我们为它设置过标记位(关闭时删除它):又看到老朋友不是?(从内存中干掉)
if (q-&testAttribute(Qt::WA_DeleteOnClose)) {
q-&setAttribute(Qt::WA_DeleteOnClose, false);
q-&deleteLater();
题外:close 还是其他代码,但与本主题无关,不再涉及。
QDialog 和 QWidget 相比,多了 done、reject 和 accept 3个相关函数:
先看看两个马甲:
void QDialog::accept()
done(Accepted);
void QDialog::reject()
done(Rejected);
done 做的事情和close比较类似:因为它调用了close所调用的 close_helper 函数。只不过不同于close函数,它始终会先让Widget不可见。然后close操作,最后根据参数发射信号
void QDialog::done(int r)
Q_D(QDialog);
setResult(r);
d-&close_helper(QWidgetPrivate::CloseNoEvent);
emit finished(r);
if (r == Accepted)
emit accepted();
else if (r == Rejected)
emit rejected();
注意:QDilaog可能包含事件循环,事件循环由QDialog::exec() 开始,QDialog::setVisible(false)将负责退出事件循环,这儿用的是其马甲hide()。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:94699次
积分:1410
积分:1410
排名:千里之外
原创:18篇
转载:199篇
(3)(2)(2)(2)(3)(1)(5)(9)(15)(21)(44)(24)(77)(9)      事情是这样的:今天调试窗体,突然发现按ESC键居然跳过closeEvent()关闭了对话框!我的关闭判断都在closeEvent()里,这直接导致非正常关闭了正在进行的工作。先重建下场景:
Corpus corpusDialog(this);
corpusDialog.exec();
典型的模态对话框,因为用了exec()。Corpus对话框类中覆盖了closeEvent(),其中父类的closeEvent()为虚函数。这样,当我按ESC关闭对话框就出现了如题情景。
后来发现,居然是因为Corpus类中没有覆盖reject()函数导致的!由Qt官方文档:
Escape Key
If the user presses the Esc key in a dialog, () will be called. This will cause the window to close: The
cannot be .
得知按ESC默认调用的是reject()函数。由于Corpus类中没有覆盖,直接调用了父类QDialog的reject()。调用QDialog的reject()会发生什么呢?
它实际调用了done(QDialog::Reject)(同样由于没有被覆盖,调用的是QDialog的done)。由Qt官方文档:
void QDialog::done ( int r )  [virtual slot]
Closes the dialog and sets its result code to r. If this dialog is shown with(), done() causes the local event loop to finish, and () to return r.
看不出done()到底做了些什么。调试跟踪了一圈,发现就我这种情况来讲,
done(QDialog::Reject)仅hide了对话框,
然后设置了exec()返回值为QDialog::Reject,
关闭窗体事件循环(这个看不出,估计的),
释放finished(QDialog::Reject)信号,
最后释放rejected()信号。
      的却没有关闭窗体呀,所以也不会触发closeEvent()。我应当在Corpus类中覆盖掉reject(),由reject()调用close()。这样就把问题解决了!
void Corpus::reject()
阅读(...) 评论()966,690 八月 独立访问用户
语言 & 开发
架构 & 设计
文化 & 方法
您目前处于:
Qt 5.5增加了新的GL模块,并改进了跨平台支持
Qt 5.5增加了新的GL模块,并改进了跨平台支持
Sergio De Simone
Author Contacted
相关厂商内容
相关赞助商
QCon全球软件开发大会上海站,日-22日,上海宝华万豪酒店,!
告诉我们您的想法
允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p
当有人回复此评论时请E-mail通知我
允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p
当有人回复此评论时请E-mail通知我
允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p
当有人回复此评论时请E-mail通知我
赞助商链接
架构 & 设计
文化 & 方法
<及所有内容,版权所有 &#169;
C4Media Inc.
服务器由 提供, 我们最信赖的ISP伙伴。
北京创新网媒广告有限公司
京ICP备号-7
注意:如果要修改您的邮箱,我们将会发送确认邮件到您原来的邮箱。
使用现有的公司名称
修改公司名称为:
公司性质:
使用现有的公司性质
修改公司性质为:
使用现有的公司规模
修改公司规模为:
使用现在的国家
使用现在的省份
Subscribe to our newsletter?
Subscribe to our industry email notices?多年来开发QT累计的笔记_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
多年来开发QT累计的笔记
上传于||文档简介
&&多&#8203;年&#8203;来&#8203;开&#8203;发&#8203;Q&#8203;T&#8203;累&#8203;计&#8203;的&#8203;笔&#8203;记&#8203;,&#8203;希&#8203;望&#8203;能&#8203;帮&#8203;助&#8203;大&#8203;家
阅读已结束,如果下载本文需要使用3下载券
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩21页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢19073人阅读
不知道标题该怎么取了,文中就简单整理一下下面几个函数吧。因为不断有网友问到此类问题(包括相关问题),所以,自己整理一下,也算学习小结了。
这些函数分两类,一类是用来删除对象的(从内存中干掉),一类是用来隐藏窗口的(从界面上干掉)
QObject::deleteLater()
QWidget::setVisible(bool)
使得Widget可见或不可见
QWidget::setHidden(bool)
QWidget::show()
QWidget::hide()
QWidget::close()
视情况确定是否调用4号0号
QDialog::done(int)
始终会调用4号,视情况调用0号
QDialog::accept()
QDialog::reject()
我们知道,
分配到heap中的对象(通过 new),当对其delete,才会被析构。
分配在stack中的对象,当其离开作用域是被析构
在 Qt 中,一般建议你使用 new 的方式创建对象。或者,你可以看看&
本文接下来的讨论,都是假定你用的 new 创建的对象。
从Qt类的祖宗开始吧。因为QObject不涉及界面啊,成员中只涉及析构问题。在
一文中,我们知道,
obj-&deleteLater();
最后调用的就是:
很简单哈。所以,这个函数的谈论(略)
另外:对象析构时会发射 destroyed 信号。注意,是对象析构时,这是句废话,但要记住。
setVisible
呵呵,show()、hide()、setVisible()、setHidden() 这4个函数让人看得眼花缭乱。怎么办?
看看代码吧:
virtual void setVisible(bool visible);
inline void setHidden(bool hidden) { setVisible(!hidden); }
inline void show() { setVisible(true); }
inline void hide() { setVisible(false); }
代码很清楚:这四个东西之中,只有 setVisible 是独立的,其他三个都是它的马甲!
setVisible 的作用是什么呢?顾名思义,使得一个Widget可见或不可见。
要点:不可见,是Widget不在界面上显示,但不代表对象被析构!
这个函数,Manual中给的其实很详细的,很透彻。但一开始想弄明白还真是不容易。
首先,我们直接调用close时(或者点击关闭按钮调用),它会生成 QCloseEvent 事件:(我们可以选择接受或阻止它,如果我们阻止事件,close将直接返回,什么都不做)
看点源码:
bool QWidgetPrivate::close_helper(CloseMode mode)
if (mode == CloseWithSpontaneousEvent)
QApplication::sendSpontaneousEvent(q, &e);
QApplication::sendEvent(q, &e);
if (!that.isNull() && !e.isAccepted()) {
data.is_closing = 0;
其次:如果我们接受了事件(默认),她就直接调用我们前面提到的朋友。(从界面上干掉)
q-&hide();
再次:如果我们为它设置过标记位(关闭时删除它):又看到老朋友不是?(从内存中干掉)
if (q-&testAttribute(Qt::WA_DeleteOnClose)) {
q-&setAttribute(Qt::WA_DeleteOnClose, false);
q-&deleteLater();
题外:close 还是其他代码,但与本主题无关,不再涉及。
QDialog 和 QWidget 相比,多了 done、reject 和 accept 3个相关函数:
先看看两个马甲:
void QDialog::accept()
done(Accepted);
void QDialog::reject()
done(Rejected);
done 做的事情和close比较类似:因为它调用了close所调用的 close_helper 函数。只不过不同于close函数,它始终会先让Widget不可见。然后close操作,最后根据参数发射信号
void QDialog::done(int r)
Q_D(QDialog);
setResult(r);
d-&close_helper(QWidgetPrivate::CloseNoEvent);
emit finished(r);
if (r == Accepted)
emit accepted();
else if (r == Rejected)
emit rejected();
注意:QDilaog可能包含事件循环,事件循环由QDialog::exec() 开始,QDialog::setVisible(false)将负责退出事件循环,这儿用的是其马甲hide()。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1551248次
积分:16939
积分:16939
排名:第382名
原创:181篇
评论:879条
本blog在IE浏览器下可能会&#26684;式错乱,请考虑非IE内核浏览器。
在多篇blog中,反斜杠\被CSDN自动替换成了斜杠/,请注意识别,谢谢。
本Blog中所有作品(文中额外注明版权的除外)均采用进行许可。
(1)(1)(2)(1)(4)(1)(9)(4)(13)(23)(24)(31)(9)(15)(23)(28)

我要回帖

更多关于 qt reject函数 的文章

 

随机推荐