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

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

  • 观察结果:
  • 会显示子GUI,但显示不正确:重新调整父GUI大小时,白色边框无法正确更新。
  • 如果将父窗口的大小调整得太小,则子进程会由于Qt代码内的内存访问冲突而崩溃。
  • 如果我不使用QWidget::createWindowContainer()指定父级,而是使用单独的顶层窗口,则可以很好地嵌入子级。
  • 子级打开模态对话框(例如QMessageBox)后,问题已修复,并且在父级的下一次调整大小后正确嵌入了子级。

  • 特别是最后一点使我感到困惑。我试图找出运行QMessageBox是否会更改子窗口小部件上的某些标志,以及是否可以手动模拟这些更改以解决此问题,而不会遇到麻烦。

    有人知道这里发生了什么吗?模态对话框可能对解决该问题的小部件有什么作用?

    最佳答案

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

    经过几次测试后,我尝试立即进行窗口重排,而使用白色边框代替了原来的OS边框:

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

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

    this->setWindowFlags(Qt::FramelessWindowHint);
    

    调整大小后,我无法重现崩溃的问题。我将子小部件添加到布局中,并且效果很好。

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

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

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

    关于c++ - 绘图错误和QWidget::createWindowContainer崩溃,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30162091/

    10-12 21:51