【问题标题】:Drawing errors and crash with QWidget::createWindowContainer使用 QWidget::createWindowContainer 绘制错误和崩溃
【发布时间】:2015-05-14 02:16:29
【问题描述】:

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

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

观察:

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

尤其是最后一点让我很困惑。我试图找出运行 QMessageBox 是否会更改子小部件上的一些标志,以及是否可以手动模拟这些更改以解决该问题,但没有运气。

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

【问题讨论】:

    标签: c++ qt qt5


    【解决方案1】:

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

    经过几次测试后,我尝试即时进行窗口重设,而不是白色边框有本机操作系统边框:

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

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

    this->setWindowFlags(Qt::FramelessWindowHint);
    

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

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

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

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

    【讨论】:

    • 感谢您的回答!因为我现在不在办公室,所以我会在 CET 星期一尝试您的建议并提供反馈。我很高兴看到您的简单解决方案是否有效!
    • 是的,FramelessWindowHint 修复了边框渲染崩溃!我很高兴有这样一个简单的解决方案/解决方法。谢谢你,你赢得了赏金! :)
    猜你喜欢
    • 2013-10-16
    • 1970-01-01
    • 2017-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-14
    • 2022-10-05
    相关资源
    最近更新 更多