Skip to content

Qt6 migration #1

@oskude

Description

@oskude

Anyone having luck porting this to Qt6?

I have no idea what i'm doing, but i got it compiling with this:

diff --git a/main.cpp b/main.cpp
index da016e2..1f0ea25 100644
--- a/main.cpp
+++ b/main.cpp
@@ -1,12 +1,14 @@
 #include <QGuiApplication>
 #include <QCommandLineParser>
 #include <QStringList>
+#include <QSGRendererInterface>
 #include "oledrenderer.h"
 #include "ssd1306driver.h"

 int main(int argc, char *argv[])
 {
     QGuiApplication app(argc, argv);
+    QQuickWindow::setGraphicsApi(QSGRendererInterface::OpenGL);
     qApp->setApplicationName("QML OLED Renderer");

     QCommandLineParser parser;
diff --git a/oledrenderer.cpp b/oledrenderer.cpp
index 0fd41e2..5ced985 100644
--- a/oledrenderer.cpp
+++ b/oledrenderer.cpp
@@ -1,6 +1,8 @@
 #include "oledrenderer.h"

 #include <QSurfaceFormat>
+#include <QQuickGraphicsDevice>
+#include <QQuickRenderTarget>

 OledRenderer::OledRenderer(QObject *parent)
     : QObject(parent)
@@ -38,7 +40,10 @@ OledRenderer::OledRenderer(QObject *parent)
         m_qmlEngine->setIncubationController(m_quickWindow->incubationController());

     m_context->makeCurrent(m_offscreenSurface);
-    m_renderControl->initialize(m_context);
+
+    m_quickWindow->setGraphicsDevice(QQuickGraphicsDevice::fromOpenGLContext(m_context));
+    if (!m_renderControl->initialize())
+        qWarning("Failed to initialize redirected Qt Quick rendering");
 }

 OledRenderer::~OledRenderer()
@@ -114,7 +119,10 @@ void OledRenderer::cleanup()
 void OledRenderer::createFbo()
 {
     m_fbo = new QOpenGLFramebufferObject(m_size * m_dpr, QOpenGLFramebufferObject::CombinedDepthStencil);
-    m_quickWindow->setRenderTarget(m_fbo);
+
+    QQuickRenderTarget rt = QQuickRenderTarget::fromOpenGLRenderBuffer(m_fbo->handle(), m_fbo->size() ,1);
+
+    m_quickWindow->setRenderTarget(rt);
 }

 void OledRenderer::destroyFbo()
@@ -166,9 +174,11 @@ bool OledRenderer::loadQml(const QString &qmlFile, const QSize &size)
 void OledRenderer::renderNext()
 {
     // Polish, synchronize and render the next frame (into our fbo).
+    m_renderControl->beginFrame();
     m_renderControl->polishItems();
     m_renderControl->sync();
     m_renderControl->render();
+    m_renderControl->endFrame();

     m_context->functions()->glFlush();

diff --git a/qml-oled-renderer.pro b/qml-oled-renderer.pro
index 46cb107..d41c21d 100644
--- a/qml-oled-renderer.pro
+++ b/qml-oled-renderer.pro
@@ -1,7 +1,7 @@
 TEMPLATE = app

 QT += qml quick
-CONFIG += c++11
+CONFIG += c++17

 SOURCES += main.cpp \
     oledrenderer.cpp \

Yet running shows a scrambled oled output and following errors:

screen 0 shmid 12
Device: /dev/i2c-1 (I2C_FUNC_I2C I2C_FUNC_SMBUS_BYTE �)
Framebuffer incomplete: 0x8cd6
Failed to build texture render target for QQuickRenderTarget
QQuickWindow: No render target (neither swapchain nor custom target was provided)
QQuickWindow: No render target (neither swapchain nor custom target was provided)
QQuickWindow: No render target (neither swapchain nor custom target was provided)
# last line repeated for every renderNext()

FWIW, i'm trying this on raspberry pi 4 and the qt5 code works.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions