Finish render() support for QQuickWidget

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>
This commit is contained in:
Laszlo Agocs 2014-08-07 15:41:58 +02:00
parent f03892bbe9
commit 549f76b521
3 changed files with 42 additions and 7 deletions

View 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);

View 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

View 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();