- QT ui 渲染使用的OpenGL,在渲染完成后会有一个FBO(framebuffer object),一般都不管这个,直接就在ui上显示了,但有时会需要ui的数据做进一步处理,就需要截留FBO,下面是相关代码,主要是在
beforeRendering
信号里设置FBO,在afterRendering
中取出FBO
int main(int argc, char *argv[]) {
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;
QQuickWindow::setDefaultAlphaBuffer(true);
const QUrl url(QStringLiteral("qrc:/main.qml"));
QObject::connect(
&engine, &QQmlApplicationEngine::objectCreated, &app,
[url](QObject *obj, const QUrl &objUrl) {
if (!obj && url == objUrl) QCoreApplication::exit(-1);
},
Qt::QueuedConnection);
engine.load(url); // 加载QML文件
if (engine.rootObjects().isEmpty())
return -1;
QQuickWindow* window = qobject_cast<QQuickWindow*>(engine.rootObjects().first());
QOpenGLFramebufferObject *_fbo = nullptr;
QObject::connect(window, &QQuickWindow::beforeRendering, &app, [&]{
if (!_fbo) {
_fbo = new QOpenGLFramebufferObject(1920, 1080);
_fbo->bind();
window->setRenderTarget(_fbo);
}
}, Qt::DirectConnection);
QObject::connect(window, &QQuickWindow::afterRendering, &app, [&]{
auto fbo = window->renderTarget();
if (!fbo) return;
if (fbo->isValid()) {
auto image = fbo->toImage();
}
}, Qt::DirectConnection);
return app.exec();
}