aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--examples/quick/quickwidgets/quickwidget/main.cpp32
-rw-r--r--src/quickwidgets/qquickwidget.cpp16
-rw-r--r--src/quickwidgets/qquickwidget_p.h1
3 files changed, 42 insertions, 7 deletions
diff --git a/examples/quick/quickwidgets/quickwidget/main.cpp b/examples/quick/quickwidgets/quickwidget/main.cpp
index 3850dde157..04c7073afe 100644
--- a/examples/quick/quickwidgets/quickwidget/main.cpp
+++ b/examples/quick/quickwidgets/quickwidget/main.cpp
@@ -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);
diff --git a/src/quickwidgets/qquickwidget.cpp b/src/quickwidgets/qquickwidget.cpp
index 6cca36b726..2541359fdd 100644
--- a/src/quickwidgets/qquickwidget.cpp
+++ b/src/quickwidgets/qquickwidget.cpp
@@ -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
diff --git a/src/quickwidgets/qquickwidget_p.h b/src/quickwidgets/qquickwidget_p.h
index 8a8d98f45e..755acb969d 100644
--- a/src/quickwidgets/qquickwidget_p.h
+++ b/src/quickwidgets/qquickwidget_p.h
@@ -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();