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. [Nuxt] Update Vuex State with Mutations and MapMutations in Vue.js

    You commit changes to state in Vuex using defined mutations. You can easily access these state mutat ...

  2. 解决Linux动态库版本兼容问题

    说道“动态库版本兼容”,很多人头脑中首先蹦出的就是“Dll Hell”.啊,这曾经让人头疼的难题.时至今日,这个难题已经很好地解决了. 在进一步讨论之前来思考一个问题:Linux下为什么没有让人头痛的 ...

  3. position:absolute和margin:auto 连用实现元素水平垂直居中

    有时候,要实现一些元素水平垂直都居中,这部分元素呢 可能大小未知,例如一些图片或者是一些未知大小的块元素. 利用绝对定位可以将要居中的元素脱离文档流. position: absolute; left ...

  4. [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 ...

  5. [TypeScript] Create a fluent API using TypeScript classes

    You can create an easy to chain API using TypeScript classes. Learn about the thisreturn type annota ...

  6. android获取和展示音乐的频谱

    做了个音乐播放器 就一直想做个加一个音乐频谱的展示界面 觉的这是一个好玩的东西,可以将耳边动听的声音形象化,仿佛眼前可以看到声音一样. 但是我在文档的开发者指南里没有讲任何有关音乐频谱的东西,最后还是 ...

  7. erlang分布式入门(一)-ping pong

    erlang分布式入门(一)-ping pong 测试环境和http://willvvv.iteye.com/blog/1523918 一样,192.168.0.182(centos-182)和192 ...

  8. 【t061】游览路线

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] 话说LCINF信息组来到烟台参加夏令营.一天,大家提议出去游玩,来到了烟台最繁华的地方.由于他们对烟台 ...

  9. 【BZOJ 1019】 [SHOI2008]汉诺塔

    [题目链接]:http://www.lydsy.com/JudgeOnline/problem.php?id=1019 [题意] [题解] 这个题解讲得很清楚了 http://blog.sina.co ...

  10. noip刷题记录 20170823

    独木桥 怎么说呢 #include<iostream> #include<cstdio> #include<algorithm> using namespace s ...