QWidget::createWindowContainer 绘图错误和崩溃
Drawing errors and crash with QWidget::createWindowContainer
在我的 Qt 5.3 应用程序中,我想将 GUI 从子进程集成到我的主进程中' window:
- 子进程创建顶级
QWidget
。
- 子进程将从
QWidget::winId()
返回的小部件 WId
传递给父进程(使用 IPC)。
- 父进程使用
QWindow::fromWinId()
和 QWidget::createWindowContainer()
创建一个 QWidget
来显示子进程的 GUI。此小部件嵌入到另一个小部件的布局中。
观察:
- 子 GUI 已显示但未正确呈现:有白色边框在调整父级大小时未正确更新。
- 如果父进程 window 调整得太小,子进程会因 Qt 代码中的内存访问冲突而崩溃。
- 如果我不使用
QWidget::createWindowContainer()
指定父项来使用单独的顶级 window,则子项嵌入得很好。
- 子项打开模态对话框后,例如
QMessageBox
,问题自行解决,下一次调整父项的大小后,子项会正确嵌入。
尤其是最后一点让我百思不得其解。我试图找出 运行 QMessageBox
是否更改了子小部件上的一些标志,以及我是否可以手动模拟这些更改以解决该问题,但运气不好。
有人知道这里发生了什么吗?模态对话框可能会对修复问题的小部件执行什么操作?
首先 - 谢谢你提出这个问题。在此之前我不知道 Qt 中的这个功能。我花了一些时间来实施您的解决方案并遇到了同样的问题:白色边框。
经过几次测试后,我尝试 window 动态重新设置父级,而不是白色边框,而是原生 OS 边框:
当调用 QWidget::createWindowContainer
Qt 时看起来像获取整个 window 的大小,显示 QWidget
(比整个 window 小)并用白色填充背景.
我找到了这个问题的解决方案:在父 window.
中调用 createWindowContainer
之前,为子小部件设置 Qt::FramelessWindowHint
window 标志
this->setWindowFlags(Qt::FramelessWindowHint);
我无法重现调整大小后崩溃的问题。我将子小部件添加到布局中,它工作正常。
你可以看看我的example source at Git Hub.
如果它不能解决您的崩溃问题,请提供此问题的一些来源。
注意:在 GitHub i 运行 子项目的示例中,从调试输出中读取 winId,修改父源代码,然后修改 运行 父项目。
在我的 Qt 5.3 应用程序中,我想将 GUI 从子进程集成到我的主进程中' window:
- 子进程创建顶级
QWidget
。 - 子进程将从
QWidget::winId()
返回的小部件WId
传递给父进程(使用 IPC)。 - 父进程使用
QWindow::fromWinId()
和QWidget::createWindowContainer()
创建一个QWidget
来显示子进程的 GUI。此小部件嵌入到另一个小部件的布局中。
观察:
- 子 GUI 已显示但未正确呈现:有白色边框在调整父级大小时未正确更新。
- 如果父进程 window 调整得太小,子进程会因 Qt 代码中的内存访问冲突而崩溃。
- 如果我不使用
QWidget::createWindowContainer()
指定父项来使用单独的顶级 window,则子项嵌入得很好。 - 子项打开模态对话框后,例如
QMessageBox
,问题自行解决,下一次调整父项的大小后,子项会正确嵌入。
尤其是最后一点让我百思不得其解。我试图找出 运行 QMessageBox
是否更改了子小部件上的一些标志,以及我是否可以手动模拟这些更改以解决该问题,但运气不好。
有人知道这里发生了什么吗?模态对话框可能会对修复问题的小部件执行什么操作?
首先 - 谢谢你提出这个问题。在此之前我不知道 Qt 中的这个功能。我花了一些时间来实施您的解决方案并遇到了同样的问题:白色边框。
经过几次测试后,我尝试 window 动态重新设置父级,而不是白色边框,而是原生 OS 边框:
当调用 QWidget::createWindowContainer
Qt 时看起来像获取整个 window 的大小,显示 QWidget
(比整个 window 小)并用白色填充背景.
我找到了这个问题的解决方案:在父 window.
中调用createWindowContainer
之前,为子小部件设置 Qt::FramelessWindowHint
window 标志
this->setWindowFlags(Qt::FramelessWindowHint);
我无法重现调整大小后崩溃的问题。我将子小部件添加到布局中,它工作正常。
你可以看看我的example source at Git Hub.
如果它不能解决您的崩溃问题,请提供此问题的一些来源。
注意:在 GitHub i 运行 子项目的示例中,从调试输出中读取 winId,修改父源代码,然后修改 运行 父项目。