diff options
19 files changed, 138 insertions, 9 deletions
diff --git a/examples/datavisualization/audiolevels/main.cpp b/examples/datavisualization/audiolevels/main.cpp index a8de6adb..a526c2ef 100644 --- a/examples/datavisualization/audiolevels/main.cpp +++ b/examples/datavisualization/audiolevels/main.cpp @@ -31,6 +31,12 @@ int main(int argc, char *argv[]) QGuiApplication app(argc, argv); Q3DBars window; + + if (!window.hasContext()) { + qWarning() << QStringLiteral("Couldn't initialize the OpenGL context.") ; + return -1; + } + window.setFlags(window.flags() ^ Qt::FramelessWindowHint); window.resize(800, 500); window.setTitle("Qt Data Visualization - Microphone audio levels visualizer"); diff --git a/examples/datavisualization/bars/main.cpp b/examples/datavisualization/bars/main.cpp index f6d8752c..9eb7a526 100644 --- a/examples/datavisualization/bars/main.cpp +++ b/examples/datavisualization/bars/main.cpp @@ -30,6 +30,7 @@ #include <QtWidgets/QSlider> #include <QtWidgets/QFontComboBox> #include <QtWidgets/QLabel> +#include <QtWidgets/QMessageBox> #include <QtGui/QScreen> #include <QtGui/QFontDatabase> @@ -41,6 +42,13 @@ int main(int argc, char **argv) QWidget *container = QWidget::createWindowContainer(widgetgraph); //! [0] + if (!widgetgraph->hasContext()) { + QMessageBox msgBox; + msgBox.setText("Couldn't initialize the OpenGL context."); + msgBox.exec(); + return -1; + } + QSize screenSize = widgetgraph->screen()->size(); container->setMinimumSize(QSize(screenSize.width() / 2, screenSize.height() / 1.5)); container->setMaximumSize(screenSize); diff --git a/examples/datavisualization/custominput/main.cpp b/examples/datavisualization/custominput/main.cpp index a104854d..28d06d4f 100644 --- a/examples/datavisualization/custominput/main.cpp +++ b/examples/datavisualization/custominput/main.cpp @@ -30,6 +30,7 @@ #include <QtWidgets/QComboBox> #include <QtWidgets/QFontComboBox> #include <QtWidgets/QLabel> +#include <QtWidgets/QMessageBox> #include <QtGui/QScreen> #include <QtGui/QFontDatabase> @@ -39,6 +40,13 @@ int main(int argc, char **argv) Q3DScatter *graph = new Q3DScatter(); QWidget *container = QWidget::createWindowContainer(graph); + if (!graph->hasContext()) { + QMessageBox msgBox; + msgBox.setText("Couldn't initialize the OpenGL context."); + msgBox.exec(); + return -1; + } + QSize screenSize = graph->screen()->size(); container->setMinimumSize(QSize(screenSize.width() / 2, screenSize.height() / 1.5)); container->setMaximumSize(screenSize); diff --git a/examples/datavisualization/customitems/main.cpp b/examples/datavisualization/customitems/main.cpp index 1e96a64a..138b1467 100644 --- a/examples/datavisualization/customitems/main.cpp +++ b/examples/datavisualization/customitems/main.cpp @@ -27,6 +27,7 @@ #include <QtWidgets/QVBoxLayout> #include <QtWidgets/QCheckBox> #include <QtWidgets/QLabel> +#include <QtWidgets/QMessageBox> int main(int argc, char **argv) { @@ -34,6 +35,13 @@ int main(int argc, char **argv) Q3DSurface *graph = new Q3DSurface(); QWidget *container = QWidget::createWindowContainer(graph); + if (!graph->hasContext()) { + QMessageBox msgBox; + msgBox.setText("Couldn't initialize the OpenGL context."); + msgBox.exec(); + return -1; + } + container->setMinimumSize(QSize(800, 600)); container->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); container->setFocusPolicy(Qt::StrongFocus); diff --git a/examples/datavisualization/customproxy/customproxy.pro b/examples/datavisualization/customproxy/customproxy.pro index 454c81e9..fd5e0852 100644 --- a/examples/datavisualization/customproxy/customproxy.pro +++ b/examples/datavisualization/customproxy/customproxy.pro @@ -23,4 +23,3 @@ RESOURCES += customproxy.qrc OTHER_FILES += doc/src/* \ doc/images/* \ data/raindata.txt - diff --git a/examples/datavisualization/customproxy/main.cpp b/examples/datavisualization/customproxy/main.cpp index 9c5373e4..b9118668 100644 --- a/examples/datavisualization/customproxy/main.cpp +++ b/examples/datavisualization/customproxy/main.cpp @@ -29,6 +29,12 @@ int main(int argc, char **argv) QGuiApplication app(argc, argv); Q3DBars *rainfall = new Q3DBars; + + if (!rainfall->hasContext()) { + qWarning() << QStringLiteral("Couldn't initialize the OpenGL context.") ; + return -1; + } + rainfall->setFlags(rainfall->flags() ^ Qt::FramelessWindowHint); rainfall->resize(1000, 800); rainfall->setPosition(QPoint(10, 30)); diff --git a/examples/datavisualization/draggableaxes/main.cpp b/examples/datavisualization/draggableaxes/main.cpp index a511935b..8d9bc8ec 100644 --- a/examples/datavisualization/draggableaxes/main.cpp +++ b/examples/datavisualization/draggableaxes/main.cpp @@ -26,6 +26,7 @@ #include <QtWidgets/QHBoxLayout> #include <QtWidgets/QVBoxLayout> #include <QtWidgets/QCommandLinkButton> +#include <QtWidgets/QMessageBox> int main(int argc, char **argv) { @@ -33,6 +34,13 @@ int main(int argc, char **argv) Q3DScatter *graph = new Q3DScatter(); QWidget *container = QWidget::createWindowContainer(graph); + if (!graph->hasContext()) { + QMessageBox msgBox; + msgBox.setText("Couldn't initialize the OpenGL context."); + msgBox.exec(); + return -1; + } + container->setMinimumSize(800, 600); container->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); container->setFocusPolicy(Qt::StrongFocus); diff --git a/examples/datavisualization/itemmodel/main.cpp b/examples/datavisualization/itemmodel/main.cpp index 77ec57a4..57fbb563 100644 --- a/examples/datavisualization/itemmodel/main.cpp +++ b/examples/datavisualization/itemmodel/main.cpp @@ -36,6 +36,7 @@ #include <QtGui/QFont> #include <QtCore/QDebug> #include <QtWidgets/QHeaderView> +#include <QtWidgets/QMessageBox> #define USE_STATIC_DATA @@ -248,6 +249,13 @@ int main(int argc, char **argv) QWidget *container = QWidget::createWindowContainer(graph); //! [0] + if (!graph->hasContext()) { + QMessageBox msgBox; + msgBox.setText("Couldn't initialize the OpenGL context."); + msgBox.exec(); + return -1; + } + QSize screenSize = graph->screen()->size(); container->setMinimumSize(QSize(screenSize.width() / 2, screenSize.height() / 2)); container->setMaximumSize(screenSize); diff --git a/examples/datavisualization/rotations/main.cpp b/examples/datavisualization/rotations/main.cpp index db38b401..40d160bb 100644 --- a/examples/datavisualization/rotations/main.cpp +++ b/examples/datavisualization/rotations/main.cpp @@ -28,6 +28,7 @@ #include <QtWidgets/QPushButton> #include <QtWidgets/QSlider> #include <QtWidgets/QLabel> +#include <QtWidgets/QMessageBox> #include <QtGui/QScreen> int main(int argc, char **argv) @@ -36,6 +37,13 @@ int main(int argc, char **argv) Q3DScatter *graph = new Q3DScatter(); QWidget *container = QWidget::createWindowContainer(graph); + if (!graph->hasContext()) { + QMessageBox msgBox; + msgBox.setText("Couldn't initialize the OpenGL context."); + msgBox.exec(); + return -1; + } + QSize screenSize = graph->screen()->size(); container->setMinimumSize(QSize(screenSize.width() / 2, screenSize.height() / 1.5)); container->setMaximumSize(screenSize); diff --git a/examples/datavisualization/scatter/main.cpp b/examples/datavisualization/scatter/main.cpp index 5d417737..c734f86c 100644 --- a/examples/datavisualization/scatter/main.cpp +++ b/examples/datavisualization/scatter/main.cpp @@ -30,6 +30,7 @@ #include <QtWidgets/QComboBox> #include <QtWidgets/QFontComboBox> #include <QtWidgets/QLabel> +#include <QtWidgets/QMessageBox> #include <QtGui/QScreen> #include <QtGui/QFontDatabase> @@ -41,6 +42,13 @@ int main(int argc, char **argv) QWidget *container = QWidget::createWindowContainer(graph); //! [0] + if (!graph->hasContext()) { + QMessageBox msgBox; + msgBox.setText("Couldn't initialize the OpenGL context."); + msgBox.exec(); + return -1; + } + QSize screenSize = graph->screen()->size(); container->setMinimumSize(QSize(screenSize.width() / 2, screenSize.height() / 1.5)); container->setMaximumSize(screenSize); diff --git a/examples/datavisualization/surface/main.cpp b/examples/datavisualization/surface/main.cpp index ca5783af..5e7bd50c 100644 --- a/examples/datavisualization/surface/main.cpp +++ b/examples/datavisualization/surface/main.cpp @@ -31,6 +31,7 @@ #include <QtWidgets/QGroupBox> #include <QtWidgets/QComboBox> #include <QtWidgets/QLabel> +#include <QtWidgets/QMessageBox> #include <QtGui/QPainter> #include <QtGui/QScreen> @@ -42,6 +43,13 @@ int main(int argc, char **argv) QWidget *container = QWidget::createWindowContainer(graph); //! [0] + if (!graph->hasContext()) { + QMessageBox msgBox; + msgBox.setText("Couldn't initialize the OpenGL context."); + msgBox.exec(); + return -1; + } + QSize screenSize = graph->screen()->size(); container->setMinimumSize(QSize(screenSize.width() / 2, screenSize.height() / 1.6)); container->setMaximumSize(screenSize); diff --git a/examples/datavisualization/texturesurface/main.cpp b/examples/datavisualization/texturesurface/main.cpp index b2e7c9e3..adea272e 100644 --- a/examples/datavisualization/texturesurface/main.cpp +++ b/examples/datavisualization/texturesurface/main.cpp @@ -28,6 +28,7 @@ #include <QtWidgets/QGroupBox> #include <QtWidgets/QCheckBox> #include <QtWidgets/QLabel> +#include <QtWidgets/QMessageBox> #include <QtGui/QScreen> #include <QtGui/QPainter> @@ -37,6 +38,13 @@ int main(int argc, char **argv) Q3DSurface *graph = new Q3DSurface(); QWidget *container = QWidget::createWindowContainer(graph); + if (!graph->hasContext()) { + QMessageBox msgBox; + msgBox.setText("Couldn't initialize the OpenGL context."); + msgBox.exec(); + return -1; + } + QSize screenSize = graph->screen()->size(); container->setMinimumSize(QSize(screenSize.width() / 2, screenSize.height() / 1.6)); container->setMaximumSize(screenSize); diff --git a/examples/datavisualization/volumetric/main.cpp b/examples/datavisualization/volumetric/main.cpp index 0508a1b3..b31fa981 100644 --- a/examples/datavisualization/volumetric/main.cpp +++ b/examples/datavisualization/volumetric/main.cpp @@ -30,6 +30,7 @@ #include <QtWidgets/QCheckBox> #include <QtWidgets/QLabel> #include <QtWidgets/QGroupBox> +#include <QtWidgets/QMessageBox> #include <QtGui/QScreen> int main(int argc, char **argv) @@ -38,6 +39,13 @@ int main(int argc, char **argv) Q3DScatter *graph = new Q3DScatter(); QWidget *container = QWidget::createWindowContainer(graph); + if (!graph->hasContext()) { + QMessageBox msgBox; + msgBox.setText("Couldn't initialize the OpenGL context."); + msgBox.exec(); + return -1; + } + QSize screenSize = graph->screen()->size(); container->setMinimumSize(QSize(screenSize.width() / 3, screenSize.height() / 3)); container->setMaximumSize(screenSize); diff --git a/src/datavisualization/engine/q3dbars.cpp b/src/datavisualization/engine/q3dbars.cpp index 3787b235..a715b4f2 100644 --- a/src/datavisualization/engine/q3dbars.cpp +++ b/src/datavisualization/engine/q3dbars.cpp @@ -92,6 +92,9 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION Q3DBars::Q3DBars(const QSurfaceFormat *format, QWindow *parent) : QAbstract3DGraph(new Q3DBarsPrivate(this), format, parent) { + if (!dptr()->m_initialized) + return; + dptr()->m_shared = new Bars3DController(geometry()); d_ptr->setVisualController(dptr()->m_shared); dptr()->m_shared->initializeOpenGL(); @@ -399,7 +402,8 @@ const Q3DBarsPrivate *Q3DBars::dptrc() const } Q3DBarsPrivate::Q3DBarsPrivate(Q3DBars *q) - : QAbstract3DGraphPrivate(q) + : QAbstract3DGraphPrivate(q), + m_shared(0) { } diff --git a/src/datavisualization/engine/q3dscatter.cpp b/src/datavisualization/engine/q3dscatter.cpp index a4d371d5..c2870db8 100644 --- a/src/datavisualization/engine/q3dscatter.cpp +++ b/src/datavisualization/engine/q3dscatter.cpp @@ -81,6 +81,9 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION Q3DScatter::Q3DScatter(const QSurfaceFormat *format, QWindow *parent) : QAbstract3DGraph(new Q3DScatterPrivate(this), format, parent) { + if (!dptr()->m_initialized) + return; + dptr()->m_shared = new Scatter3DController(geometry()); d_ptr->setVisualController(dptr()->m_shared); dptr()->m_shared->initializeOpenGL(); @@ -251,7 +254,8 @@ QList<QValue3DAxis *> Q3DScatter::axes() const } Q3DScatterPrivate::Q3DScatterPrivate(Q3DScatter *q) - : QAbstract3DGraphPrivate(q) + : QAbstract3DGraphPrivate(q), + m_shared(0) { } diff --git a/src/datavisualization/engine/q3dsurface.cpp b/src/datavisualization/engine/q3dsurface.cpp index 1d6c0a1f..8db2b381 100644 --- a/src/datavisualization/engine/q3dsurface.cpp +++ b/src/datavisualization/engine/q3dsurface.cpp @@ -96,6 +96,9 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION Q3DSurface::Q3DSurface(const QSurfaceFormat *format, QWindow *parent) : QAbstract3DGraph(new Q3DSurfacePrivate(this), format, parent) { + if (!dptr()->m_initialized) + return; + dptr()->m_shared = new Surface3DController(geometry()); d_ptr->setVisualController(dptr()->m_shared); dptr()->m_shared->initializeOpenGL(); @@ -302,7 +305,8 @@ QList<QValue3DAxis *> Q3DSurface::axes() const // Q3DSurfacePrivate Q3DSurfacePrivate::Q3DSurfacePrivate(Q3DSurface *q) - : QAbstract3DGraphPrivate(q) + : QAbstract3DGraphPrivate(q), + m_shared(0) { } diff --git a/src/datavisualization/engine/qabstract3dgraph.cpp b/src/datavisualization/engine/qabstract3dgraph.cpp index 2f3caccd..bc40fbf9 100644 --- a/src/datavisualization/engine/qabstract3dgraph.cpp +++ b/src/datavisualization/engine/qabstract3dgraph.cpp @@ -189,7 +189,11 @@ QAbstract3DGraph::QAbstract3DGraph(QAbstract3DGraphPrivate *d, const QSurfaceFor d_ptr->m_context->setFormat(requestedFormat()); d_ptr->m_context->create(); - d_ptr->m_context->makeCurrent(this); + bool makeSuccess = d_ptr->m_context->makeCurrent(this); + + // If we fail to get context, just abort + if (!makeSuccess || !QOpenGLContext::currentContext()) + return; initializeOpenGLFunctions(); @@ -208,6 +212,8 @@ QAbstract3DGraph::QAbstract3DGraph(QAbstract3DGraphPrivate *d, const QSurfaceFor qFatal("GLSL version must be 1.20 or higher. Try installing latest display drivers."); } + d_ptr->m_initialized = true; + d_ptr->renderLater(); #if defined(Q_OS_OSX) @@ -872,6 +878,20 @@ qreal QAbstract3DGraph::margin() const } /*! + * \return \c{true} if the OpenGL context of the graph has been successfully initialized. + * Trying to use a graph when the context initialization has failed typically results in a crash. + * A common reason for a context initialization failure is lack of sufficient platform support + * for OpenGL. + */ +bool QAbstract3DGraph::hasContext() const +{ + if (d_ptr->m_initialized) + return true; + else + return false; +} + +/*! * \internal */ bool QAbstract3DGraph::event(QEvent *event) @@ -898,9 +918,11 @@ void QAbstract3DGraph::resizeEvent(QResizeEvent *event) { Q_UNUSED(event); - Q3DScene *scene = d_ptr->m_visualController->scene(); - scene->d_ptr->setWindowSize(QSize(width(), height())); - scene->d_ptr->setViewport(QRect(0, 0, width(), height())); + if (d_ptr->m_visualController) { + Q3DScene *scene = d_ptr->m_visualController->scene(); + scene->d_ptr->setWindowSize(QSize(width(), height())); + scene->d_ptr->setViewport(QRect(0, 0, width(), height())); + } } /*! @@ -968,7 +990,8 @@ QAbstract3DGraphPrivate::QAbstract3DGraphPrivate(QAbstract3DGraph *q) m_updatePending(false), m_visualController(0), m_devicePixelRatio(1.f), - m_offscreenSurface(0) + m_offscreenSurface(0), + m_initialized(false) { } diff --git a/src/datavisualization/engine/qabstract3dgraph.h b/src/datavisualization/engine/qabstract3dgraph.h index 13e2faf0..4a13ca5e 100644 --- a/src/datavisualization/engine/qabstract3dgraph.h +++ b/src/datavisualization/engine/qabstract3dgraph.h @@ -186,6 +186,8 @@ public: void setMargin(qreal margin); qreal margin() const; + bool hasContext() const; + protected: bool event(QEvent *event); void resizeEvent(QResizeEvent *event); diff --git a/src/datavisualization/engine/qabstract3dgraph_p.h b/src/datavisualization/engine/qabstract3dgraph_p.h index 6ff5f418..07c1ade5 100644 --- a/src/datavisualization/engine/qabstract3dgraph_p.h +++ b/src/datavisualization/engine/qabstract3dgraph_p.h @@ -75,6 +75,7 @@ public: Abstract3DController *m_visualController; float m_devicePixelRatio; QOffscreenSurface *m_offscreenSurface; + bool m_initialized; }; QT_END_NAMESPACE_DATAVISUALIZATION |