使用QWidget :: createWindowContainer

时间:2015-05-11 07:41:34

标签: c++ qt qt5

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

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

    1. 显示子GUI但未正确呈现:在重新调整父级大小时,有白色边框无法正确更新。
    2. 如果父窗口调整得太小,子进程会因Qt代码中的内存访问冲突而崩溃。
    3. 如果我没有指定父母QWidget::createWindowContainer()使用单独的顶级窗口,那么孩子就可以很好地嵌入。
    4. 在孩子打开模式对话框(例如QMessageBox)后,问题会自行修复,并且在下次调整父级的大小后正确嵌入子项。
    5. 特别是最后一点让我感到困惑。我试图找出运行QMessageBox是否更改了子窗口小部件上的一些标志,以及我是否可以手动模拟这些更改以解决问题,但没有运气。

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

1 个答案:

答案 0 :(得分:3)

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

经过几次测试后,我尝试在运行中进行窗口重新渲染,而白色边框则是本机操作系统边界:

native borders after reparenting

看起来当调用QWidget::createWindowContainer Qt获得整个窗口的大小时,显示QWidget(尺寸小于整个窗口)并用白色填充背景。

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

this->setWindowFlags(Qt::FramelessWindowHint);

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

您可以查看我的example source at Git Hub

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

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