Yondu202 2020-05-18 15:36 采纳率: 0%
浏览 800

如何理解 Qt 中 Native Window 与 Alien Widget 的层级关系以及布局对层级关系的影响?

测试程序下载地址

问题描述

(Qt5.7.1)
主界面有一个 Widget, 它有一个子控件 label1, 同时 Widget 有一个同级兄弟控件 label2。

现在我需要设置 label1 为 NativeWindow,同时:

  1. label1 还设置了 WA_DontCreateNativeAncestors,让他的祖先控件不要成为 NativeWindow;
  2. 主程序设置了 QCoreApplication::setAttribute(Qt::AA_DontCreateNativeWidgetSiblings); 不让 NativeWindow 兄弟控件也成为 NativeWindow;



程序运行后发现 Widget 这个控件显示混乱了

(1)混乱的显示结果,如图:

图片说明



(2)期望的正常显示结果如下:

图片说明


进一步说明

  1. (1) 混乱的结果中,我没有在 Widget 中设置 Layout, 并将 label1 到 Layout 里;
  2. (2)正确的结果中,使用了 Layout


问题

  1. (1)混乱的显示的原因可能源于哪里?
  2. (2)中仅仅增加了布局就显示正常了,那么Qt 自带的 Layout 对 NativeWindow 有什么影响呢?
  3. Native Window 和 Alien Widget 的层级关系如何,Native Window 会比同级的 Alien Widget 的 Z-order 序列更高吗?
  • 写回答

1条回答 默认 最新

  • wara笑 2020-07-24 17:42
    关注

    在我的项目中也遇到了与你一样的问题,我使用的Qt5.6.3。
    实际上即使应用布局也任然存在绘制混乱的问题(如:窗口大小改变时)。
    以下以你的 Demo 来进行描述:
    1.虽然 label1 的绘制区域超出其应有的大小但是通过 spy 查看窗口区域,我发现其窗口区域是正确的,且调用 label1.grab 得到的图像也是正确的;
    2.为 label1 添加点击事件监听,我发现点击绘制区域超出的部分竟然能够响应事件,但是 spy 则没有捕获到相应的消息;
    因此我推断当 native window 作为 alien widget 的子部件时,alien widget 对 native window 的坐标系统转换之类的存在 BUG。
    最后我移除了 label1 的 WA_DontCreateNativeAncestors 属性才得以解决问题。

    ps:
    从qt官方可确认到 widget 同时设置 WA_DontCreateNativeAncestors 、WA_NativeWindow 时确实存在问题,但那是 qt4 版本的:
    https://fami.codefreak.ru/gitlab/peter/qt4/commit/5051053485e4e96772897a36fa19a6d347770150

    评论

报告相同问题?

悬赏问题

  • ¥15 2024-五一综合模拟赛
  • ¥15 下图接收小电路,谁知道原理
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题
  • ¥15 matlab中使用gurobi时报错
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭