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

http://blog.csdn.net/dbzhang800/article/details/7006270

最新文章

  1. 【无私分享:ASP.NET CORE 项目实战】目录索引
  2. 在linux使用make编译ArduPilot for Pixhawk/PX4 ArduPilot 编译环境搭建
  3. iOS开发中的错误整理,百思项目&#39;我的&#39;模块,tableFooterViewHeight的问题.提醒自己对KVO和Block的运用欠缺
  4. codeforces 630A Again Twenty Five!
  5. Java开发之多线程下载和断点续传
  6. 【HDOJ】4585 Shaolin
  7. 关于非现场审计软件的一些介绍(ACL、IEDA、Teammate)
  8. 如何用浏览器在线查看.ipynb文件
  9. nrf52832-定时器例程
  10. Sublime Text快捷键与插件介绍
  11. Core Java Fundation
  12. 单细胞数据高级分析之初步降维和聚类 | Dimensionality reduction | Clustering
  13. chromium ③
  14. (转)Memcache内存分配策略
  15. Flash插件flashplugin-nonfree的手动更新
  16. 开源http协议库curl和wget的区别和使用
  17. SG 函数初步 HDU 1536 &amp;amp;&amp;amp; HDU 1944
  18. Linux 系统版本信息
  19. [JVM] - 不就是JVM么 JVM的继续探究
  20. 搭建高可用mysql系列(2)-- Percona XtraDB Cluster 安装

热门文章

  1. v-if和updated钩子结合使用 渲染echart图表
  2. xxxyyy
  3. ArcGIS中ObjectID,FID和OID字段区别
  4. spark提交应用的方法(spark-submit)
  5. 字典(dictionary)的设计
  6. 网站访问优化(二):开启apache服务器gzip压缩
  7. 【t010】最近距离
  8. Android中的动画具体解释系列【3】——自己定义动画研究
  9. CentOS 7安装fcitx中文输入法
  10. Redis Service