QWidget::createWindowContainer 绘图错误和崩溃

Drawing errors and crash with QWidget::createWindowContainer

在我的 Qt 5.3 应用程序中,我想将 GUI 从子进程集成到我的主进程中' window:

  1. 子进程创建顶级 QWidget
  2. 子进程将从 QWidget::winId() 返回的小部件 WId 传递给父进程(使用 IPC)。
  3. 父进程使用 QWindow::fromWinId()QWidget::createWindowContainer() 创建一个 QWidget 来显示子进程的 GUI。此小部件嵌入到另一个小部件的布局中。

观察:

  1. 子 GUI 已显示但未正确呈现:有白色边框在调整父级大小时未正确更新。
  2. 如果父进程 window 调整得太小,子进程会因 Qt 代码中的内存访问冲突而崩溃。
  3. 如果我不使用 QWidget::createWindowContainer() 指定父项来使用单独的顶级 window,则子项嵌入得很好。
  4. 子项打开模态对话框后,例如 QMessageBox,问题自行解决,下一次调整父项的大小后,子项会正确嵌入。

尤其是最后一点让我百思不得其解。我试图找出 运行 QMessageBox 是否更改了子小部件上的一些标志,以及我是否可以手动模拟这些更改以解决该问题,但运气不好。

有人知道这里发生了什么吗?模态对话框可能会对修复问题的小部件执行什么操作?

首先 - 谢谢你提出这个问题。在此之前我不知道 Qt 中的这个功能。我花了一些时间来实施您的解决方案并遇到了同样的问题:白色边框。

经过几次测试后,我尝试 window 动态重新设置父级,而不是白色边框,而是原生 OS 边框:

当调用 QWidget::createWindowContainer Qt 时看起来像获取整个 window 的大小,显示 QWidget(比整个 window 小)并用白色填充背景.

我找到了这个问题的解决方案:在父 window.

中调用 createWindowContainer 之前,为子小部件设置 Qt::FramelessWindowHint window 标志
this->setWindowFlags(Qt::FramelessWindowHint);

我无法重现调整大小后崩溃的问题。我将子小部件添加到布局中,它工作正常。

你可以看看我的example source at Git Hub.

如果它不能解决您的崩溃问题,请提供此问题的一些来源。

注意:在 GitHub i 运行 子项目的示例中,从调试输出中读取 winId,修改父源代码,然后修改 运行 父项目。