diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/datavisualization/engine/q3dbars.cpp | 6 | ||||
-rw-r--r-- | src/datavisualization/engine/q3dscatter.cpp | 6 | ||||
-rw-r--r-- | src/datavisualization/engine/q3dsurface.cpp | 6 | ||||
-rw-r--r-- | src/datavisualization/engine/qabstract3dgraph.cpp | 33 | ||||
-rw-r--r-- | src/datavisualization/engine/qabstract3dgraph.h | 2 | ||||
-rw-r--r-- | src/datavisualization/engine/qabstract3dgraph_p.h | 1 |
6 files changed, 46 insertions, 8 deletions
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 |