知识不是单独的,一定是成体系的。更多我的个人总结和相关经验可查阅这个专栏:Visual Studio。

这个问题是我在开发这个工程时遇到的:【VTK】VTK 让小球动起来,在 Windows 上使用 Visual Studio 配合 Qt 构建 VTK。

文章目录

问题

在使用 Qt 来开发 VTK 时,新建了一个小球,希望在 ui 的 Widget 控件中显示小球,并更改其位置。但是,程序一直卡死,提示 cannot make QOpenGLContext current in a different thread。我是用的是 QVTKOpenGLNativeWidget 作为渲染窗口。

复制一下错误信息,方便别人在检索时能检索到我这个文章。错误信息如下:

cannot make QOpenGLContext current in a different thread


解决方案

错误信息 “cannot make QOpenGLContext current in a different thread” 表明在不同的线程中尝试在 Qt 和 VTK 中使用 QOpenGLContext。

在使用 Qt 和 VTK 时,需要确保:

  1. 在主线程中创建和使用 Qt 和 VTK 对象。Qt 和 VTK 都是线程敏感的,特别是涉及到图形渲染的部分。因此,可以在主线程中进行 Qt 和 VTK 的初始化和操作。
  2. 如果需要在不同的线程中进行耗时的计算或数据处理,可以在主线程中使用信号槽机制将结果发送给渲染线程,然后在渲染线程中更新 VTK 场景。这样可以确保在正确的线程中进行 OpenGL 上下文的操作。
  3. 如果需要在不同的线程中更新 VTK 场景,可以尝试使用 QVTKOpenGLWidget 而不是 QVTKWidget。QVTKOpenGLWidget 是一个在 Qt 中用于显示 VTK 场景的小部件,并且在内部使用了 QOpenGLWidget。QOpenGLWidget 具有与 OpenGL 上下文相关的线程限制,可以更好地处理线程间的上下文切换。
  4. 如果使用多线程,确保您的 OpenGL 上下文在正确的线程中进行操作。使用 QOpenGLContext::currentContext() 函数获取当前线程中的上下文,并在需要操作 OpenGL 的代码块中进行判断和设置。

请注意,确保在操作 OpenGL 上下文之前了解 Qt 的线程模型,并根据需要正确管理和处理线程间的上下文切换。

我是用的是 QVTKOpenGLNativeWidget 作为渲染窗口,因此尤其需要注意以下几点:

  1. 确保在主线程中创建和初始化 QVTKOpenGLNativeWidget 对象。将其添加到主线程的窗口层次结构中,并在主线程中显示和操作该小部件。
  2. 当需要在其他线程中更新 VTK 场景时,使用 Qt 的信号槽机制来与主线程进行通信。将更新场景的请求发送到主线程,并在主线程中进行 VTK 场景的更新操作。
  3. 在接收到来自其他线程的信号时,确保在主线程中处理信号,并在主线程中调用 VTK 的相关函数来更新场景。这样可以确保在正确的线程上进行 OpenGL 上下文的操作。
  4. 如果涉及到多个线程,确保在进行 OpenGL 上下文操作之前正确地切换上下文。可以使用 QOpenGLContext::currentContext() 来获取当前线程中的上下文,并在需要操作 OpenGL 的代码块中进行判断和设置。

最后,我成功后的案例以及代码放在了这篇文章中,有需要可查阅:【VTK】VTK 让小球动起来,在 Windows 上使用 Visual Studio 配合 Qt 构建 VTK。


在解决 cannot make QOpenGLContext current in a different thread 后,顺带这个错误:vtkGenericOpenGLRenderWindow GLEW could not be initialized: Missing GL version 也自动消失了。

在这里插入图片描述

Ref.

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐