Finish render() support for QQuickWidget
authorLaszlo Agocs <laszlo.agocs@digia.com>
Thu, 7 Aug 2014 13:41:58 +0000 (15:41 +0200)
committerLaszlo Agocs <laszlo.agocs@digia.com>
Mon, 11 Aug 2014 11:19:47 +0000 (13:19 +0200)
The enablers are already in. Now we just need to use the virtual in
QQuickWidgetPrivate and test it.

Task-number: QTBUG-39562
Change-Id: I1faf5a0a244ba4169fb8f9b0dae657304038b60e
Reviewed-by: Gunnar Sletta <gunnar.sletta@jollamobile.com>
examples/quick/quickwidgets/quickwidget/main.cpp
src/quickwidgets/qquickwidget.cpp
src/quickwidgets/qquickwidget_p.h

index 3850dde..04c7073 100644 (file)
@@ -50,6 +50,8 @@ public:
 private slots:
     void quickWidgetStatusChanged(QQuickWidget::Status);
     void sceneGraphError(QQuickWindow::SceneGraphError error, const QString &message);
+    void grabToFile();
+    void renderToFile();
 
 private:
     QQuickWidget *m_quickWidget;
@@ -88,7 +90,11 @@ MainWindow::MainWindow()
 
     setCentralWidget(centralWidget);
 
-    QMenu *fileMenu = menuBar()->addMenu(tr("File"));
+    QMenu *fileMenu = menuBar()->addMenu(tr("&File"));
+    QAction *grabAction = fileMenu->addAction(tr("Grab to image"));
+    connect(grabAction, SIGNAL(triggered()), this, SLOT(grabToFile()));
+    QAction *renderAction = fileMenu->addAction(tr("Render to pixmap"));
+    connect(renderAction, SIGNAL(triggered()), this, SLOT(renderToFile()));
     QAction *quitAction = fileMenu->addAction(tr("Quit"));
     connect(quitAction, SIGNAL(triggered()), qApp, SLOT(quit()));
 }
@@ -108,6 +114,30 @@ void MainWindow::sceneGraphError(QQuickWindow::SceneGraphError, const QString &m
      statusBar()->showMessage(message);
 }
 
+template<class T> void saveToFile(QWidget *parent, T *saveable)
+{
+    QString t;
+    QFileDialog fd(parent, t, QString());
+    fd.setAcceptMode(QFileDialog::AcceptSave);
+    fd.setDefaultSuffix("png");
+    fd.selectFile("test.png");
+    if (fd.exec() == QDialog::Accepted)
+        saveable->save(fd.selectedFiles().first());
+}
+
+void MainWindow::grabToFile()
+{
+    QImage image = m_quickWidget->grabFramebuffer();
+    saveToFile(this, &image);
+}
+
+void MainWindow::renderToFile()
+{
+    QPixmap pixmap(m_quickWidget->size());
+    m_quickWidget->render(&pixmap);
+    saveToFile(this, &pixmap);
+}
+
 int main(int argc, char **argv)
 {
     QApplication app(argc, argv);
index 6cca36b..2541359 100644 (file)
@@ -238,6 +238,15 @@ void QQuickWidgetPrivate::renderSceneGraph()
     q->update();
 }
 
+QImage QQuickWidgetPrivate::grabFramebuffer()
+{
+    if (!context)
+        return QImage();
+
+    context->makeCurrent(offscreenSurface);
+    return renderControl->grab();
+}
+
 /*!
     \module QtQuickWidgets
     \title Qt Quick Widgets C++ Classes
@@ -1103,12 +1112,7 @@ QSurfaceFormat QQuickWidget::format() const
  */
 QImage QQuickWidget::grabFramebuffer() const
 {
-    Q_D(const QQuickWidget);
-    if (!d->context)
-        return QImage();
-
-    d->context->makeCurrent(d->offscreenSurface);
-    return d->renderControl->grab();
+    return const_cast<QQuickWidgetPrivate *>(d_func())->grabFramebuffer();
 }
 
 QT_END_NAMESPACE
index 8a8d98f..755acb9 100644 (file)
@@ -89,6 +89,7 @@ public:
     void handleContextCreationFailure(const QSurfaceFormat &format, bool isEs);
 
     GLuint textureId() const Q_DECL_OVERRIDE;
+    QImage grabFramebuffer() Q_DECL_OVERRIDE;
 
     void init(QQmlEngine* e = 0);
     void handleWindowChange();