Skip to content

Commit

Permalink
fix crash when using ImageView
Browse files Browse the repository at this point in the history
  • Loading branch information
wwmayer committed Dec 20, 2016
1 parent ed57a89 commit a862279
Showing 1 changed file with 31 additions and 4 deletions.
35 changes: 31 additions & 4 deletions src/Mod/Image/Gui/ImageView.cpp
Expand Up @@ -40,6 +40,37 @@ using namespace ImageGui;
ImageView::ImageView(QWidget* parent)
: MDIView(0, parent), _ignoreCloseEvent(false)
{
// Create an OpenGL widget for displaying images
#if QT_VERSION >=0x050000
// Since Qt5 there is a weird behaviour when creating a GLImageBox.
// It works correctly for the first time when creating an image view
// but only when no 3d view is created. For the second time or if a
// 3d view is created it fails with an assert() inside the function
// QWindowPrivate::create because QWindowsIntegration::createPlatformWindow
// fails to create an instance of QPlatformWindow.
// The reason for the failure is that for the passed parent widget
// i.e. this ImageView the QPlatformWindow is also null.
// As said above it works the very first time because at construction time
// of GLImageBox it doesn't set the ImageView as parent but the parent of
// the ImageView, i.e. the main window. This mafic happens inside the
// function QWidgetPrivate::setParent_sys at this line:
// QWidget *parentWithWindow =
// newparent ? (newparent->windowHandle() ? newparent : newparent->nativeParentWidget()) : 0;
// where newparent->nativeParentWidget() returns the main window.
// For the second time this magic fails. Interesting in this context is
// that for the 3d view this magic always works.
// In order to fix this problem we directly pass the pointer of the parent
// of this ImageView, i.e. the main window.
// Note:
// Since Qt the class QGLWidget is marked as deprecated and should be
// replaced by QOpenGLWidget.

_pGLImageBox = new GLImageBox(parent);
#else
_pGLImageBox = new GLImageBox(this);
#endif
setCentralWidget(_pGLImageBox);

// enable mouse tracking when moving even if no buttons are pressed
setMouseTracking(true);

Expand All @@ -49,10 +80,6 @@ ImageView::ImageView(QWidget* parent)
// Create the default status bar for displaying messages
enableStatusBar(true);

// Create an OpenGL widget for displaying images
_pGLImageBox = new GLImageBox(this);
setCentralWidget(_pGLImageBox);

_currMode = nothing;
_currX = 0;
_currY = 0;
Expand Down

0 comments on commit a862279

Please sign in to comment.