Qt 之 show,hide,setVisible,setHidden,close 等小结
来源:互联网 发布:施工计算软件 编辑:程序博客网 时间:2024/06/01 07:33
这些函数分两类,一类是用来删除对象的(从内存中干掉),一类是用来隐藏窗口的(从界面上干掉)
0
QObject::deleteLater()
delete obj;析构对象
1
QWidget::setVisible(bool)
使得Widget可见或不可见
2
QWidget::setHidden(bool)
1号的马甲
3
QWidget::show()
1号的马甲
4
QWidget::hide()
1号的马甲
5
QWidget::close()
视情况确定是否调用4号0号
6
QDialog::done(int)
始终会调用4号,视情况调用0号
7
QDialog::accept()
6号的马甲
8
QDialog::reject()
6号的马甲
写在前面
我们知道,
- 分配到heap中的对象(通过 new),当对其delete,才会被析构。
- 分配在stack中的对象,当其离开作用域是被析构
在 Qt 中,一般建议你使用 new 的方式创建对象。或者,你可以看看 从 Qt 的 delete 说开来
注意:
本文接下来的讨论,都是假定你用的 new 创建的对象。
QObject
从Qt类的祖宗开始吧。因为QObject不涉及界面啊,成员中只涉及析构问题。在从 Qt 的 delete 说开来 一文中,我们知道,
obj->deleteLater();
最后调用的就是:
delete obj;
很简单哈。所以,这个函数的谈论(略)
另外:对象析构时会发射 destroyed 信号。注意,是对象析构时,这是句废话,但要记住。
QWidget
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不在界面上显示,但不代表对象被析构!
close
这个函数,Manual中给的其实很详细的,很透彻。但一开始想弄明白还真是不容易。
首先,我们直接调用close时(或者点击关闭按钮调用),它会生成 QCloseEvent 事件:(我们可以选择接受或阻止它,如果我们阻止事件,close将直接返回,什么都不做)
看点源码:
bool QWidgetPrivate::close_helper(CloseMode mode){... QCloseEvent e; if (mode == CloseWithSpontaneousEvent) QApplication::sendSpontaneousEvent(q, &e); else QApplication::sendEvent(q, &e); if (!that.isNull() && !e.isAccepted()) { data.is_closing = 0; return false; }...}
其次:如果我们接受了事件(默认),她就直接调用我们前面提到的朋友。(从界面上干掉)
q->hide();
再次:如果我们为它设置过标记位(关闭时删除它):又看到老朋友不是?(从内存中干掉)
if (q->testAttribute(Qt::WA_DeleteOnClose)) { q->setAttribute(Qt::WA_DeleteOnClose, false); q->deleteLater(); }
题外:close 还是其他代码,但与本主题无关,不再涉及。
QDialog
QDialog 和 QWidget 相比,多了 done、reject 和 accept 3个相关函数:
先看看两个马甲:
void QDialog::accept(){ done(Accepted);}void QDialog::reject(){ done(Rejected);}
done
done 做的事情和close比较类似:因为它调用了close所调用的 close_helper 函数。只不过不同于close函数,它始终会先让Widget不可见。然后close操作,最后根据参数发射信号
void QDialog::done(int r){ Q_D(QDialog); hide(); 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()。
- Qt 之 show,hide,setVisible,setHidden,close 等小结
- Qt 之 show,hide,setVisible,setHidden,close 等小结
- Qt 之 show,hide,setVisible,setHidden,close 等小结
- Qt 之 show,hide,setVisible,setHidden,close 等小结
- Qt 之 show,hide,setVisible,setHidden,close 等小结 .
- Qt 之 show,hide,setVisible,setHidden,close 等小结
- Qt 之 show,hide,setVisible,setHidden,close 等小结
- Qt 之 show,hide,setVisible,setHidden,close 等小结
- Qt 之 show,hide,setVisible,setHidden,close 等小结
- Qt 之 show,hide,setVisible,setHidden,close 等小结
- Qt之show()、hide()、close()、exec()、open()比较
- Qt close hide reject等
- qt窗体close和hide的区别
- ext hide(),setVisible(false),remov
- Jquery基础之hide,show,toggle
- 22-service之show hide disable
- Qt下hide()与close()相关的bug一例
- 记QDialog中exec、show、hide等函数要点
- 关于不同版本jdk的tomcat共存问题
- pushViewController后获得返回事件
- Java Community Process JCP地址
- pushViewController/presentModalViewController/addSubView区别及使用方法
- 反射学习
- Qt 之 show,hide,setVisible,setHidden,close 等小结
- 使用localStorage替代cookie做本地存储,例如最近浏览历史记录
- UINavigationControll采用pushViewController后如何去掉左边的返回按钮
- makfile中.PHONY的认识
- 0欧姆电阻 电感与磁珠的选择
- 64位程序与32位程序区别
- Ogre内部渲染流程分析系列
- Android开发最近错误总结:
- 在字符串中找出连续最长的数字串,并把这个串的长度返回