diff --git a/src/imports/qtcanvas3d/canvas3d.cpp b/src/imports/qtcanvas3d/canvas3d.cpp
index f696c64de9f27e4b4c4eae352a2961d53f2437a0..0dd3d74b1a33e42f326bb3793aaba20c0504030d 100644
--- a/src/imports/qtcanvas3d/canvas3d.cpp
+++ b/src/imports/qtcanvas3d/canvas3d.cpp
@@ -99,6 +99,7 @@ Canvas::Canvas(QQuickItem *parent):
     m_isOpenGLES2(false),
     m_isSoftwareRendered(false),
     m_isContextAttribsSet(false),
+    m_resizeGLQueued(false),
     m_antialiasFbo(0),
     m_renderFbo(0),
     m_displayFbo(0),
@@ -107,8 +108,8 @@ Canvas::Canvas(QQuickItem *parent):
 {
     connect(this, &QQuickItem::windowChanged, this, &Canvas::handleWindowChanged);
     connect(this, &Canvas::needRender, this, &Canvas::renderNext, Qt::QueuedConnection);
-    connect(this, &QQuickItem::widthChanged, this, &Canvas::emitResizeGL, Qt::DirectConnection);
-    connect(this, &QQuickItem::heightChanged, this, &Canvas::emitResizeGL, Qt::DirectConnection);
+    connect(this, &QQuickItem::widthChanged, this, &Canvas::queueResizeGL, Qt::DirectConnection);
+    connect(this, &QQuickItem::heightChanged, this, &Canvas::queueResizeGL, Qt::DirectConnection);
     setAntialiasing(false);
 
     // Set contents to false in case we are in qml designer to make component look nice
@@ -490,7 +491,9 @@ void Canvas::setPixelSize(QSize pixelSize)
 
     m_fboSize = pixelSize;
     createFBOs();
-    emit pixelSizeChanged(pixelSize);
+
+    // Queue the pixel size signal to next repaint cycle and queue repaint
+    queueResizeGL();
     emitNeedRender();
 }
 
@@ -648,7 +651,7 @@ void Canvas::updateWindowParameters()
         if (pixelRatio != m_devicePixelRatio) {
             m_devicePixelRatio = pixelRatio;
             emit devicePixelRatioChanged(pixelRatio);
-            emitResizeGL();
+            queueResizeGL();
             win->update();
         }
     }
@@ -862,6 +865,14 @@ void Canvas::renderNext()
     // Bind the correct render target FBO
     bindCurrentRenderTarget();
 
+    // Signal changes in pixel size
+    if (m_resizeGLQueued) {
+        qCDebug(canvas3drendering).nospace() << "Canvas3D::" << __FUNCTION__
+                                             << " Emit resizeGL() signal";
+        emit resizeGL(int(width()), int(height()), m_devicePixelRatio);
+        m_resizeGLQueued = false;
+    }
+
     // Ensure we have correct clip rect set in the context
     QRect viewport = m_context3D->glViewportRect();
     glViewport(viewport.x(), viewport.y(), viewport.width(), viewport.height());
@@ -948,22 +959,11 @@ void Canvas::renderNext()
 /*!
  * \internal
  */
-void Canvas::emitResizeGL()
+void Canvas::queueResizeGL()
 {
     qCDebug(canvas3drendering).nospace() << "Canvas3D::" << __FUNCTION__ << "()";
 
-    // Wait until render node has been created
-    if (!m_renderNodeReady) {
-        qCDebug(canvas3drendering).nospace() << "Canvas3D::" << __FUNCTION__
-                                             << " Render node not ready, returning";
-        return;
-    }
-
-    if (m_glContext) {
-        qCDebug(canvas3drendering).nospace() << "Canvas3D::" << __FUNCTION__
-                                             << " Emit resizeGL() signal";
-        emit resizeGL(int(width()), int(height()), m_devicePixelRatio);
-    }
+    m_resizeGLQueued = true;
 }
 
 /*!
diff --git a/src/imports/qtcanvas3d/canvas3d_p.h b/src/imports/qtcanvas3d/canvas3d_p.h
index 63497b26d24b687fa253bce178a4e0c7ec667a78..00828699b6a3ab98d842a9eced52d3917575ffb9 100644
--- a/src/imports/qtcanvas3d/canvas3d_p.h
+++ b/src/imports/qtcanvas3d/canvas3d_p.h
@@ -111,7 +111,7 @@ public slots:
     void ready();
     void shutDown();
     void renderNext();
-    void emitResizeGL();
+    void queueResizeGL();
     void emitNeedRender();
 
 signals:
@@ -161,6 +161,7 @@ private:
     bool m_runningInDesigner;
     CanvasContextAttributes m_contextAttribs;
     bool m_isContextAttribsSet;
+    bool m_resizeGLQueued;
 
     QOpenGLFramebufferObject *m_antialiasFbo;
     QOpenGLFramebufferObject *m_renderFbo;