QWidget之Alien与Native小记
来源:互联网 发布:那个淘宝网最好最便宜 编辑:程序博客网 时间:2024/05/21 10:01
在QWidget 之paint部分杂记提到了从Qt4.4开始,Alien Widget被引入。那么...这是什么东西呢,我们在使用中又可能会感受到什么东西?
用例子来说话似乎比用源码来说话来得容易,所以看例子:
例子
一个小例子: 创建 a -> b -> c -> d -> e 共5个widget
考虑它们各自的
- parentWidget()
- nativeParentWidget()
- window()
分别返回什么呢?
#include <QtGui>#include <QtCore>class Widget:public QWidget{public: Widget(const QString& name, QWidget *parent=0) :QWidget(parent) { setProperty("name", name); }protected: void showEvent(QShowEvent *) { qDebug()<<"name:"<<property("name").toString(); if (parentWidget()) qDebug()<<" parent:" <<parentWidget()->property("name").toString(); if (nativeParentWidget()) qDebug()<<" nativeParent:" <<nativeParentWidget()->property("name").toString(); qDebug()<<" window:"<<window()->property("name").toString(); }};int main(int argc, char *argv[]){ QApplication app(argc, argv); Widget a("A"); Widget b("B", &a); Widget c("C", &b); Widget d("D", &c); Widget e("E", &d); a.show(); return app.exec();}
结果如下
name: "E" parent: "D" nativeParent: "A" window: "A" name: "D" parent: "C" nativeParent: "A" window: "A" name: "C" parent: "B" nativeParent: "A" window: "A" name: "B" parent: "A" nativeParent: "A" window: "A" name: "A" window: "A"列成表格
name
"A"
"B"
"C"
"D"
"E"
parentWidget()
0
"A"
"B"
"C"
"D"
nativeParentWidget()
0
"A"
"A"
"A"
"A"
window()
"A"
"A"
"A"
"A"
"A"
parentWidget()和window()应该没什么问题,nativeParentWidget()可能会让人费解
如果在main函数内加上一行
app.setAttribute(Qt::AA_NativeWindows);
那么,nativeParentWidget()就会和parentWidget()保持一致了。
如果main函数内加一行
c.setAttribute(Qt::WA_NativeWindow);或者是
c.setAttribute(Qt::WA_NativeWindow); c.setAttribute(Qt::WA_DontCreateNativeAncestors);
又可以得到不同但是很有意思的结果。
原因?
之所以会有这些东西,就是因为从Qt4.4开始,Alien Widget被引入了,且比native Widget更有优势。
在这个例子中,只有a是native的(因为它是顶级窗口,是window,必须如此),其他的b/c/d/e默认均是alien的。如果真有需要,我们可以有选择的设置某个widget或所有widget均是native的。
QWidget几个成员
前面例子中我们看了3个:
QWidget::parentWidget ()
最普通的东西,当前widget的父亲
QWidget::window ()
当前widget所在的窗口,顶级窗口
QWidget::nativeParentWidget ()
离自己最近的且是native的祖先
密切相关的还有2个:
QWidget::winId ()
如果当前Widget不是native,则先自动变成native,再返回ID
QWidget::effectiveWinId ()
有效ID,如果不是native,则返回nativeParentWidget的ID
再就是:QWidget中有个废弃的成员
QWidget::topLevelWidget ()
它和QWidget::window()同义。尽管没什么用了,但对我们理解一些东西可能有用。
topLevelWidget <==> window
- QWidget之Alien与Native小记
- QWidget之Alien与Native小记
- QWidget 之 Secondary Windows 小记
- native与html交互小记
- QThread与QWidget使用
- QThread与QWidget使用
- QGraphicsProxyWidget 与 QWidget 点滴
- QThread与QWidget使用
- QThread与QWidget使用
- Thread与QWidget使用
- QThread与QWidget使用
- QDialog与QWidget
- QGraphicsProxyWidget 与 QWidget 点滴
- QWidget之键盘焦点
- exec()之QWidget,QDialog
- Qt类之--Qwidget
- 小记react-native 安装
- React-native小记
- utf-8和ANSI
- 17th Training
- [LeetCode]Median of Two Sorted Arrays
- zoj 3547 The Boss on Mars
- 我的人生应该踏实一点
- QWidget之Alien与Native小记
- sphinx
- CSS 选择器
- 流媒体协议介绍(rtp/rtcp/rtsp/rtmp/mms/hls)
- [笔记]eclipse中批量修改Java类文件中引入的package包路径 - [工具使用]
- hdu 4640 Island and study-sister
- interface 和 dispinterface 区别
- Eclipse reports rendering library more recent than ADT plug-in.Please update ADT plug-in
- smarty 里面如何判断 是最后一条记录 就不输出 “|”