关于QT nativeWindow

来源:互联网 发布:mac升级显卡 编辑:程序博客网 时间:2024/06/03 17:38

撸了两个多月的QT,脑袋一团浆糊,想把零碎的东西稍微粘合一下,否则永远不清不楚,flag就不立了,单纯先记一笔流水账,当然后面的账赊着,有朝一日来还掉,大可能性是直接失忆,《西部世界》里dolores说someday意味着永远也不,是否我的人格设定也纠缠了这个someday,不得而知,只能寄希望于finally。

1.系统级别 QApplication::setAttribute(Qt::AA_NativeWindows)

(1)设置Qt::AA_NativeWindows

所有控件均视为window,可通过QGuiApplication::allWindows()获取所有控件,然后获取窗口id和大小,并且,观察每个子widget大小(通过widget->geometry()获取),可发现均集中在屏幕左上角,并且在显示上,屏幕左上角均是矩形空白,并且随着缩放,矩形空白也在变化,widget大小也在变化,即整个widget是多个子widget的合并,每个widget在底层均有一个窗口系统的句柄和内存空间,对刷新会有一定影响。
对于依托父widget建立的widget,也有自己的窗口句柄,并且依然依附于父widget。
对于没有依托父widget建立的widget,有自己的窗口句柄,并且作为独立窗口,默认显示在屏幕左上角。

(2)不设置 Qt::AA_NativeWindows

只有toplevelWidget有本地窗口系统句柄,屏幕没有矩形空白,按照QT文档所述,非native_window由QT自己绘制。
对于依托父widget建立的widget,没有自己的窗口句柄,依附于父widget。
对于没有依托父widget建立的widget,有自己的窗口句柄,并且作为独立窗口,默认显示在屏幕左上角。

2.widget级别 setAttribute(Qt::WA_NativeWindow)

这个widget以及其祖先都会设置成native_window,并且父widget的所有子widget也都会变(enforceNativeChildren()函数),所以发现allWindows变多了,如果不需要所有祖先都变,需要加 setAttribute(Qt::WA_DontCreateNativeAncestors),如果不需要所有兄弟都变,需要加系统级参数QApplication::setAttribute(Qt::AA_DontCreateNativeWidgetSiblings);

3.widget的winId()函数和setAttribute(Qt::WA_NativeWindow)类似,并且返回widget的句柄id

0 0
原创粉丝点击