从另一个线程渲染到QWindow

Rendering to QWindow from another thread

本文关键字:QWindow 另一个 线程      更新时间:2023-10-16

我一直在试图解决我的问题一段时间了,现在,到目前为止,我没有找到一个解决方案

我有一个QT应用程序,现在我需要在其中添加一个QWindow来使用opengl进行绘制。

我知道我需要调用QWidget::createWindowContainer()来创建我可以插入到另一个小部件或主窗口的QWidget。现在,我已经在我的子类QWindow类中创建了一个上下文。窗户暴露的时候我就这么做。然后我创建了另一个线程,我的渲染类生活,传递QOpenGLContext给它,使它当前在那里,但无论我尝试它只是不工作。

QWindow的子类。我只是初始化上下文,没有别的(我已经在构造函数中设置了表面类型):

void OpenGLWindow::initialize()
{
    if (!m_context) {
        m_context = new QOpenGLContext();
        m_context->setFormat(requestedFormat());
        m_context->create();
    }
    if(!isRunning) {
    thread = new ThreadHelper(m_context, this);
    thread->start();
    }
} 

然后ThreadHelper:

ThreadHelper::ThreadHelper(QOpenGLContext *context, OpenGLWindow *window) : 
m_window(window),
m_context(context)
{
}

void ThreadHelper::run()
{
    m_context->makeCurrent(m_window);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
    glClearColor(1.0, 0.0, 0.0, 0.5);
    // the rendering is done here, it's a loop, where I loop 
    // over classes and call the render method
}
void ThreadHelper::swapOpenGLBuffers(){
    m_context->swapBuffers(m_window);
}

它在m_context-> makeccurrent (m_window)行崩溃。

还尝试将上下文移动到另一个线程,但没有成功,我得到一个运行时错误,说它不能移动。

来自文档:

QOpenGLContext可以通过moveToThread()移动到不同的线程。不要从不同的线程中调用makeccurrent ()QOpenGLContext对象所属的。上下文只能是当前的在一根线上,一次在一个表面上,一根线只有一次只能运行一个上下文

所以你需要在启动线程之前调用m_context->moveToThread(thread)之类的东西。这可能不适合您,因为您试图在另一个线程中调用它。moveToThread必须在当前拥有该对象的线程(即创建该对象的线程)中调用。

相关文章: