QWidget之Alien与Native小记(果然是DirectUI的方式,QWidget居然提供了nativeParentWidget函数,而且可以动态设置native父窗口)good
2017-12-14 19:02
651 查看
在QWidget 之paint部分杂记提到了从Qt4.4开始,Alien Widget被引入。那么...这是什么东西呢,我们在使用中又可能会感受到什么东西?
用例子来说话似乎比用源码来说话来得容易,所以看例子:
考虑它们各自的
parentWidget()
nativeParentWidget()
window()
分别返回什么呢?
列成表格
parentWidget()和window()应该没什么问题,nativeParentWidget()可能会让人费解
如果在main函数内加上一行
那么,nativeParentWidget()就会和parentWidget()保持一致了。
如果main函数内加一行
或者是
又可以得到不同但是很有意思的结果。
在这个例子中,只有a是native的(因为它是顶级窗口,是window,必须如此),其他的b/c/d/e默认均是alien的。如果真有需要,我们可以有选择的设置某个widget或所有widget均是native的。
密切相关的还有2个:
再就是:QWidget中有个废弃的成员
QWidget::topLevelWidget ()
它和QWidget::window()同义。尽管没什么用了,但对我们理解一些东西可能有用。
http://blog.csdn.net/dbzhang800/article/details/7006270
用例子来说话似乎比用源码来说话来得容易,所以看例子:
例子
一个小例子: 创建 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" |
如果在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的祖先 |
QWidget::winId () | 如果当前Widget不是native,则先自动变成native,再返回ID |
QWidget::effectiveWinId () | 有效ID,如果不是native,则返回nativeParentWidget的ID |
QWidget::topLevelWidget ()
它和QWidget::window()同义。尽管没什么用了,但对我们理解一些东西可能有用。
topLevelWidget <==> window
http://blog.csdn.net/dbzhang800/article/details/7006270
相关文章推荐
- Qt - QDialog,QWidget实现模态及非模态(模态Widget不能有父窗口,如果设置无边框就不能阻塞父窗口,但是可以强行设置指定Qt::Dialog,还可以setAttribute(Qt::WA_ShowModal),很多讲究)good
- 不能获取IP地址而且可以重启网卡设置的修复方式
- C#入门学习-----菜单应用(添加剂快捷方式、设置菜单项是否可用、修改菜单字体、创建级联菜单、级联菜单的动态合并)
- HttpHelps类,用来实现Http访问,Post或者Get方式的,直接访问,带Cookie的,带证书的等方式,可以设置代理
- linux mysql新建用户及让该用户可以在另外一台电脑通过sqlyong,jdbc方式访问设置说明
- QWidget继承自QPaintDevice,这样就可以直接把QWidget传入QPainter的构造函数,比如QPainter(mylabel),然后设置QWidget的长宽后直接进行作画了
- 几种可以实现在不同设备动态正常显示表格数据的方式
- 如果js设置移动端有两种方式 大家可以参考
- 面试题:一个方法和类名相同,那这个是构造方法吗?哪些方式可以获取或设置成员变量的值?
- 图片转成BASE64字符串,然后以JSON的方式传递。当图片大小在1M左右的时候没问题,可以上传。但是当文件大小>1.5M的是否发现图片转BASE64不成功,居然得到的值是NULL
- Yii2 提供可以用属性的方式去获取类的一个方法
- 为TextView设置两种状态,程序中可以动态切换
- mac 设置打开方式, 图标右键显示简介,可以选择打开使用的方式
- activiti 工作流 动态 设置 指定 节点任务人、责任人、组 的实现方式
- HttpHelps类,用来实现Http访问,Post或者Get方式的,直接访问,带Cookie的,带证书的等方式,可以设置代理
- CentOS6设置静态IP而且还可以上网
- postman 中url有动态变换的值时,可以按下面方式变换。
- 动态设置显示方式
- QWidget可以设置QStyle,它可以绘制很多东西(具体内容没研究,待续)
- TreeSet集合存放自定义类型的对象,可以使用比较器,实现Comparable接口自己设置排序方式