QWidget之Alien与Native小记(果然是DirectUI的方式,QWidget居然提供了nativeParentWidget函数,而且可以动态设置native父窗口)good
在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的更多相关文章
- 微信支付开发(4) 动态链接Native支付
关键字:微信支付 微信支付v3 动态native支付 统一支付 Native支付 prepay_id 作者:方倍工作室原文: http://www.cnblogs.com/txw1958/p/wxpa ...
- JNI动态注册native方法及JNI数据使用
前言 或许你知道了jni的简单调用,其实不算什么百度谷歌一大把,虽然这些jni绝大多数情况下都不会让我们安卓工程师来弄,毕竟还是有点难,但是我们还是得打破砂锅知道为什么这样干吧,至少也让我们知道调用流 ...
- Qt - QDialog,QWidget实现模态及非模态(模态Widget不能有父窗口,如果设置无边框就不能阻塞父窗口,但是可以强行设置指定Qt::Dialog,还可以setAttribute(Qt::WA_ShowModal),很多讲究)good
在Qt中QDialog为“窗口”,而QWidget为“部件”,首先还是了解下<Qt 窗口与部件的概念>. 对于 QDialog 的模态及非模态是直接可以实现的,很多课本中都会提到,此处总结 ...
- Qt中事件处理的方法(三种处理方法,四种覆盖event函数,notify函数,event过滤,事件处理器。然后继续传递给父窗口。可观察QWidget::event的源码,它是虚拟保护函数,可改写)
一.Qt中事件处理的方式 1.事件处理模式一 首先是事件源产生事件,最后是事件处理器对这些事件进行处理.然而也许大家会问, Qt中有这么多类的事件,我们怎么样比较简便的处理每个事件呢?设想,如果是 ...
- Qt::QWidget 无默认标题栏边框的拖拽修改大小方式
开发环境:win10+vs2015+qt5.9.1 背景:开发过程中,一般很少会使用系统提供的标题栏和边框:往往都是自定义一个自己设计的方案.这时候在QWidget中需要加上flag:Qt::Fram ...
- Qt自定义弹窗屏蔽父窗口(QWidget设置setWindowModality(Qt::ApplicationModal);以后再show)
写Qt程序时遇到一个问题: Qt自带的弹窗功能单一,所以须要自己用ui设计弹窗的内容,这样弹窗就和普通窗口一样了,但问题是这个弹窗显示后父窗口还是活动的.网上找了很久找到了解决办法: Qt::Wind ...
- Android Native 代码NDK开发学习笔记
引用:http://www.kunli.info/2011/08/21/android-native-code-study-note/ JNI,全称Java Native Interface,是用于让 ...
- [译] Facebook:我们是如何构建第一个跨平台的 React Native APP
英文原文(需FQ):https://code.facebook.com/posts/1189117404435352/ 早些时候,我们介绍过iOS版的React Native. React Nativ ...
- 20145211 《Java程序设计》第九周学习总结——垂死病中惊坐起
教材学习内容总结 JDBC简介 JDBC是用于执行SQL的解决方案,开发人员使用JDBC的标准接口,数据库厂商则对接口进行操作,开发人员无须接触底层数据库驱动程序的差异性 JDBC标准分为两个部分:J ...
随机推荐
- UVA 10047 - The Monocycle BFS
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...
- mongodb查询部分满足条件的列
db.tblorders.createIndex( { orderid : -1 },{background:true, name:"index_orderid"} ); db.o ...
- stm32优先级
- [AngularFire2] Update multi collections at the same time with FirebaseRef
At some point, you might need to udpate multi collections and those collections should all updated s ...
- Java 字符转Unicode
static String unicode2String(String unicodeStr) { StringBuffer sb = new StringBuffer(); String str[] ...
- 最简单的基于FFmpeg的移动端样例:IOS HelloWorld
===================================================== 最简单的基于FFmpeg的移动端样例系列文章列表: 最简单的基于FFmpeg的移动端样例:A ...
- andorid 自己定义SwitchButton
因项目缘故需又一次定制SwitchButton,效果例如以下: 步骤例如以下: 1.圆角矩形的绘制 2.字体绘制 3.小圆绘制 4.左右滑动动画效果绘制 代码例如以下: package com.s ...
- 【40.17%】【codeforces 569B】Inventory
time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...
- com.octo.captcha.service.CaptchaServiceException: Invalid ID, could not validate unexisting o
<p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px;"& ...
- JavaScript 正則表達式
一.简单介绍 1.什么是正則表達式 正則表達式本身就是一种语言,这在其他语言是通用的. 正則表達式(regular expression)描写叙述了一种字符串匹配的模式,能够用来检查一个串是否含有某种 ...