gpt4 book ai didi

c++ - QWidget::createWindowContainer 的绘图错误和崩溃

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:40:23 24 4
gpt4 key购买 nike

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

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

观察:

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

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

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

最佳答案

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

经过几次测试后,我尝试动态重新调整窗口的父级,而不是白色边框,而是原生操作系统边框:

native borders after reparenting

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

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

this->setWindowFlags(Qt::FramelessWindowHint);

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

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

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

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

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com