为什么 QQuickFramebufferObject::createRenderer 没有被调用?

问题描述 投票:0回答:2

我使用Qt官方的fboitem示例,但无法正确渲染。 createRenderer应该是框架内部自动调用的,打印日志发现没有调用,所以没有进行渲染。

但是为什么不自动调用呢?

查看Qt官方提到只有当前程序使用OpenGL渲染时才会调用,但是如何设置程序支持OpenGL渲染呢? https://doc.qt.io/qt-6/qquickframebufferobject.html

这是简单的代码


class FboInSGRenderer : public QQuickFramebufferObject
{
    Q_OBJECT
    QML_NAMED_ELEMENT(Renderer)
public:
    Renderer *createRenderer() const;
};

class LogoInFboRenderer : public QQuickFramebufferObject::Renderer
{
public:
    LogoInFboRenderer()
    {
        logo.initialize();
    }

    void render() override {
        logo.render();
        update();
    }

    QOpenGLFramebufferObject *createFramebufferObject(const QSize &size) override {
        QOpenGLFramebufferObjectFormat format;
        format.setAttachment(QOpenGLFramebufferObject::CombinedDepthStencil);
        format.setSamples(4);
        return new QOpenGLFramebufferObject(size, format);
    }

    LogoRenderer logo;
};

QQuickFramebufferObject::Renderer *FboInSGRenderer::createRenderer() const
{
    qDebug() << "#createRenderer call......";
    return new LogoInFboRenderer();
}

int main(int argc, char **argv)
{
    QGuiApplication app(argc, argv);

    QQuickView view;
    view.setResizeMode(QQuickView::SizeRootObjectToView);
    view.setSource(QUrl("qrc:///scenegraph/fboitem/main.qml"));
    view.show();

    return app.exec();
}

运行结果

那么我哪里出错了?

我的开发环境:

Qt 5.15.2 MinGW64
Windows 10 Pro
Processor: Intel(R) Core(TM) i7-10510U CPU @ 1.80GHz 2.30 GHz
Graphics Card: NVIDIA GeForce MX330
c++ qt opengl qml
2个回答
1
投票

问题解决了

我的本地注册表被某些软件修改了

QMLSCENE_DEVICE =softwarecontext

所以,只要删除这个并重新启动电脑就可以了


0
投票

在 Qt 6 中,至少在 Qt 6.7 中,在加载 QML 之前可能需要在 main.cpp 中添加以下调用:

QQuickWindow::setGraphicsApi(QSGRendererInterface::OpenGL);

isOpenGL()
内部有对
QQuickFramebufferObject::updatePaintNode()
的调用,如果返回
false
将阻止调用
createRenderer()

© www.soinside.com 2019 - 2024. All rights reserved.