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

QWidget之Alien与Native小记(果然是DirectUI的方式,QWidget居然提供了nativeParentWidget函数,而且可以动态设置native父窗口)good的更多相关文章

  1. 微信支付开发(4) 动态链接Native支付

    关键字:微信支付 微信支付v3 动态native支付 统一支付 Native支付 prepay_id 作者:方倍工作室原文: http://www.cnblogs.com/txw1958/p/wxpa ...

  2. JNI动态注册native方法及JNI数据使用

    前言 或许你知道了jni的简单调用,其实不算什么百度谷歌一大把,虽然这些jni绝大多数情况下都不会让我们安卓工程师来弄,毕竟还是有点难,但是我们还是得打破砂锅知道为什么这样干吧,至少也让我们知道调用流 ...

  3. Qt - QDialog,QWidget实现模态及非模态(模态Widget不能有父窗口,如果设置无边框就不能阻塞父窗口,但是可以强行设置指定Qt::Dialog,还可以setAttribute(Qt::WA_ShowModal),很多讲究)good

    在Qt中QDialog为“窗口”,而QWidget为“部件”,首先还是了解下<Qt 窗口与部件的概念>. 对于 QDialog 的模态及非模态是直接可以实现的,很多课本中都会提到,此处总结 ...

  4. Qt中事件处理的方法(三种处理方法,四种覆盖event函数,notify函数,event过滤,事件处理器。然后继续传递给父窗口。可观察QWidget::event的源码,它是虚拟保护函数,可改写)

    一.Qt中事件处理的方式   1.事件处理模式一 首先是事件源产生事件,最后是事件处理器对这些事件进行处理.然而也许大家会问, Qt中有这么多类的事件,我们怎么样比较简便的处理每个事件呢?设想,如果是 ...

  5. Qt::QWidget 无默认标题栏边框的拖拽修改大小方式

    开发环境:win10+vs2015+qt5.9.1 背景:开发过程中,一般很少会使用系统提供的标题栏和边框:往往都是自定义一个自己设计的方案.这时候在QWidget中需要加上flag:Qt::Fram ...

  6. Qt自定义弹窗屏蔽父窗口(QWidget设置setWindowModality(Qt::ApplicationModal);以后再show)

    写Qt程序时遇到一个问题: Qt自带的弹窗功能单一,所以须要自己用ui设计弹窗的内容,这样弹窗就和普通窗口一样了,但问题是这个弹窗显示后父窗口还是活动的.网上找了很久找到了解决办法: Qt::Wind ...

  7. Android Native 代码NDK开发学习笔记

    引用:http://www.kunli.info/2011/08/21/android-native-code-study-note/ JNI,全称Java Native Interface,是用于让 ...

  8. [译] Facebook:我们是如何构建第一个跨平台的 React Native APP

    英文原文(需FQ):https://code.facebook.com/posts/1189117404435352/ 早些时候,我们介绍过iOS版的React Native. React Nativ ...

  9. 20145211 《Java程序设计》第九周学习总结——垂死病中惊坐起

    教材学习内容总结 JDBC简介 JDBC是用于执行SQL的解决方案,开发人员使用JDBC的标准接口,数据库厂商则对接口进行操作,开发人员无须接触底层数据库驱动程序的差异性 JDBC标准分为两个部分:J ...

随机推荐

  1. iOS_02_什么是ios开发

    什么是ios开发? * 已知:ios是iphone,ipad等手持设备操作系统. * ios开发就是开发运行在ios系统上的应用或者游戏软件,比如手机QQ,微博或者游戏,说白了,就是开发手机软件:当然 ...

  2. Altium Designer如何重命名文件

  3. LA 5902 - Movie collection 树状数组(Fenwick树)

    看题传送门 题目大意:XXX喜欢看电影,他有好多好多的影碟,每个影碟都有个独立的编号.开始是从下往上影碟的顺序是n~1,他每次拿出影碟的时候,你需要输出压在该影碟上的有几个.(拿出后其他影碟顺序不变) ...

  4. P2P平台公司的9种职位

     1.技术   开发类:开发系统,实现新功能   维护类:服务器和网站维护   更多:Web前端等      观点:技术岗位很关键,但是很多不懂技术的老板,不会认可你的价值.   太多的老板,以为技术 ...

  5. [AngualrJS NG-redux] Map State and Dispatchers to Redux

    In this lesson, we are going to learn how to map our Angular component directly to our application s ...

  6. 服务器svn 小乌龟 visualsvn server manager Tortoisesvn的部署使用

    这个主要说说实现hook,就是本地上传文件后,服务器svn将相应的文件也修改了,实现本地上传,可以及时在浏览器查看效果 首先安装visualsvn 可参考http://blog.csdn.net/zl ...

  7. 使用JQuery将前端form表单数据转换为JSON字符串传递到后台处理

    一般地,我们在处理表单(form表单哦)数据时,传输对象或字符串到后台,Spring MVC或SpringBoot的Controller接收时使用一个对象作为参数就可以被正常接收并封装到对象中.这种方 ...

  8. python implementation for Qt's QDataStream(看一下QDataStream的结构)

    #!/usr/bin/env python # -*- coding: utf- -*- from __future__ import print_function from __future__ i ...

  9. mysql 悲观锁 的运用

    悲观锁: 它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度,因此,在整个数据处理过程中,将数据处于锁定状态.悲观锁的实现,往往依靠数据库提供的锁机制(也只有数 ...

  10. WD-保修验证(WCC7K4ARTDF1)

    https://support.wdc.com/warranty/warrantystatus.aspx?lang=cn WCC7K4ARTDF1 有限保修期限内 WD40EFRX WD Red 09 ...