From 6269e4fafc882b9727fe06b405b876af99060d8c Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Wed, 5 Mar 2014 10:44:52 +0100 Subject: [PATCH] Add some error handling to the QWindowContainer example. Use a QMainWindow and display errors occurring during loading QML as well as scene graph errors (for example, failure to create an Open GL context) in the status bar. Change-Id: Id9cf190e8a4f40de0f18ab081e2747135221bb88 Reviewed-by: Laszlo Agocs --- examples/quick/embeddedinwidgets/main.cpp | 74 ++++++++++++++++++----- 1 file changed, 60 insertions(+), 14 deletions(-) diff --git a/examples/quick/embeddedinwidgets/main.cpp b/examples/quick/embeddedinwidgets/main.cpp index 7a30b277de..dd2fda927b 100644 --- a/examples/quick/embeddedinwidgets/main.cpp +++ b/examples/quick/embeddedinwidgets/main.cpp @@ -39,35 +39,81 @@ ** ****************************************************************************/ -#include +#include #include #include #include +#include +#include +#include +#include +#include #include -int main(int argc, char **argv) +class MainWindow : public QMainWindow { + Q_OBJECT +public: + MainWindow(); + +private slots: + void quickViewStatusChanged(QQuickView::Status); + void sceneGraphError(QQuickWindow::SceneGraphError error, const QString &message); + +private: + QQuickView *m_quickView; +}; + +MainWindow::MainWindow() + : m_quickView(new QQuickView) { - QApplication app(argc, argv); + QWidget *centralWidget = new QWidget(this); + QVBoxLayout *layout = new QVBoxLayout(centralWidget); - QWidget rootWidget; + m_quickView->setResizeMode(QQuickView::SizeRootObjectToView); + connect(m_quickView, SIGNAL(statusChanged(QQuickView::Status)), + this, SLOT(quickViewStatusChanged(QQuickView::Status))); + connect(m_quickView, SIGNAL(sceneGraphError(QQuickWindow::SceneGraphError,QString)), + this, SLOT(sceneGraphError(QQuickWindow::SceneGraphError,QString))); + m_quickView->setSource(QUrl(QStringLiteral("qrc:///embeddedinwidgets/main.qml"))); - QVBoxLayout *layout = new QVBoxLayout(); - rootWidget.setLayout(layout); - - QQuickView *view = new QQuickView(); - view->setResizeMode(QQuickView::SizeRootObjectToView); - view->setSource(QUrl(QStringLiteral("qrc:///embeddedinwidgets/main.qml"))); - - QWidget *container = QWidget::createWindowContainer(view); - container->setMinimumSize(view->size()); + QWidget *container = QWidget::createWindowContainer(m_quickView); + container->setMinimumSize(m_quickView->size()); container->setFocusPolicy(Qt::TabFocus); layout->addWidget(new QLineEdit(QStringLiteral("A QLineEdit"))); layout->addWidget(container); layout->addWidget(new QLineEdit(QStringLiteral("A QLineEdit"))); + setCentralWidget(centralWidget); - rootWidget.show(); + QMenu *fileMenu = menuBar()->addMenu(tr("File")); + QAction *quitAction = fileMenu->addAction(tr("Quit")); + connect(quitAction, SIGNAL(triggered()), qApp, SLOT(quit())); +} + +void MainWindow::quickViewStatusChanged(QQuickView::Status status) +{ + if (status == QQuickView::Error) { + QStringList errors; + foreach (const QQmlError &error, m_quickView->errors()) + errors.append(error.toString()); + statusBar()->showMessage(errors.join(QStringLiteral(", "))); + } +} + +void MainWindow::sceneGraphError(QQuickWindow::SceneGraphError, const QString &message) +{ + statusBar()->showMessage(message); +} + +int main(int argc, char **argv) +{ + QApplication app(argc, argv); + + MainWindow mainWindow; + mainWindow.show(); return app.exec(); } + +#include "main.moc"