使用QWidget :: createWindowContainer绘制错误和崩溃

Fer*_*yer 6 c++ qt qt5

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

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

观察:

  1. 显示子GUI但未正确呈现:在重新调整父级大小时,存在无法正确更新的白色边框.
  2. 如果父窗口调整得太小,子进程会因Qt代码中的内存访问冲突而崩溃.
  3. 如果我没有指定父QWidget::createWindowContainer()级使用单独的顶级窗口,那么子嵌入就好了.
  4. 在孩子打开模式对话框之后,例如QMessageBox,问题自行修复,并且在父级的下一次调整大小之后正确嵌入子项.

特别是最后一点让我困惑.我试图找出是否QMessageBox在子窗口小部件上运行更改一些标志,如果我可以手动模拟这些更改来解决问题,没有运气.

有谁知道这里发生了什么?模态对话框可能对修复问题的小部件做了什么?

小智 4

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

经过几次测试后,我尝试动态调整窗口父级,取而代之的是白色边框,有本机操作系统边框:

重新调整父级后的原生边界

看起来像当调用QWidget::createWindowContainerQt 时获取整个窗口的大小,显示QWidget(比整个窗口更小的尺寸)并用白色填充背景。

我找到了这个问题的解决方案:Qt::FramelessWindowHint在调用父窗口之前为子窗口小部件设置窗口标志createWindowContainer

this->setWindowFlags(Qt::FramelessWindowHint);
Run Code Online (Sandbox Code Playgroud)

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

您可以在 Git Hub 上查看我的示例源代码

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

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