summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMiikka Heikkinen <miikka.heikkinen@theqtcompany.com>2015-12-29 12:27:48 +0200
committerMiikka Heikkinen <miikka.heikkinen@theqtcompany.com>2015-12-30 08:45:14 +0000
commit64f0d4fb353ae2e447483897839d4df8b5b32f54 (patch)
treefeb89a4253b05c20377b980773edc7619bbae0b9
parent104c12823b1cbccb2a25593b0af319c0a42abbb5 (diff)
Add a method for checking if context was successfully created
Now it is possible to check after graph construction if the graph is actually usable in environments where the OpenGL support might not be sufficient. Task-number: QTRD-3748 Change-Id: Ia68b4e51386859f6d0c7b09cb44e50a74730ca55 Reviewed-by: Titta Heikkala <titta.heikkala@theqtcompany.com>
-rw-r--r--examples/datavisualization/audiolevels/main.cpp6
-rw-r--r--examples/datavisualization/bars/main.cpp8
-rw-r--r--examples/datavisualization/custominput/main.cpp8
-rw-r--r--examples/datavisualization/customitems/main.cpp8
-rw-r--r--examples/datavisualization/customproxy/customproxy.pro1
-rw-r--r--examples/datavisualization/customproxy/main.cpp6
-rw-r--r--examples/datavisualization/draggableaxes/main.cpp8
-rw-r--r--examples/datavisualization/itemmodel/main.cpp8
-rw-r--r--examples/datavisualization/rotations/main.cpp8
-rw-r--r--examples/datavisualization/scatter/main.cpp8
-rw-r--r--examples/datavisualization/surface/main.cpp8
-rw-r--r--examples/datavisualization/texturesurface/main.cpp8
-rw-r--r--examples/datavisualization/volumetric/main.cpp8
-rw-r--r--src/datavisualization/engine/q3dbars.cpp6
-rw-r--r--src/datavisualization/engine/q3dscatter.cpp6
-rw-r--r--src/datavisualization/engine/q3dsurface.cpp6
-rw-r--r--src/datavisualization/engine/qabstract3dgraph.cpp33
-rw-r--r--src/datavisualization/engine/qabstract3dgraph.h2
-rw-r--r--src/datavisualization/engine/qabstract3dgraph_p.h1
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