QGLWidget: Prevent premature platform window creation

Passing Qt::MSWindowsOwnDC along with the window flags to the QWidget
constructor results in creating a native window as part of the base
class initialization.

By deferring the window creation to later in the QGLWidget construction,
the meta object reflects the actual class.

Change-Id: I51343c767057d6841331614b93ad860fe99d65e3
Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
bb10
Tor Arne Vestbø 2018-10-22 19:00:31 +02:00
parent 7087a68fbf
commit b75babc6ae
1 changed files with 13 additions and 16 deletions

View File

@ -3880,12 +3880,9 @@ void QGLContext::doneCurrent()
*/
QGLWidget::QGLWidget(QWidget *parent, const QGLWidget* shareWidget, Qt::WindowFlags f)
: QWidget(*(new QGLWidgetPrivate), parent, f | Qt::MSWindowsOwnDC)
: QWidget(*(new QGLWidgetPrivate), parent, f)
{
Q_D(QGLWidget);
setAttribute(Qt::WA_PaintOnScreen);
setAttribute(Qt::WA_NoSystemBackground);
setAutoFillBackground(true); // for compatibility
d->init(new QGLContext(QGLFormat::defaultFormat(), this), shareWidget);
}
@ -3893,12 +3890,9 @@ QGLWidget::QGLWidget(QWidget *parent, const QGLWidget* shareWidget, Qt::WindowFl
\internal
*/
QGLWidget::QGLWidget(QGLWidgetPrivate &dd, const QGLFormat &format, QWidget *parent, const QGLWidget *shareWidget, Qt::WindowFlags f)
: QWidget(dd, parent, f | Qt::MSWindowsOwnDC)
: QWidget(dd, parent, f)
{
Q_D(QGLWidget);
setAttribute(Qt::WA_PaintOnScreen);
setAttribute(Qt::WA_NoSystemBackground);
setAutoFillBackground(true); // for compatibility
d->init(new QGLContext(format, this), shareWidget);
}
@ -3935,12 +3929,9 @@ QGLWidget::QGLWidget(QGLWidgetPrivate &dd, const QGLFormat &format, QWidget *par
QGLWidget::QGLWidget(const QGLFormat &format, QWidget *parent, const QGLWidget* shareWidget,
Qt::WindowFlags f)
: QWidget(*(new QGLWidgetPrivate), parent, f | Qt::MSWindowsOwnDC)
: QWidget(*(new QGLWidgetPrivate), parent, f)
{
Q_D(QGLWidget);
setAttribute(Qt::WA_PaintOnScreen);
setAttribute(Qt::WA_NoSystemBackground);
setAutoFillBackground(true); // for compatibility
d->init(new QGLContext(format, this), shareWidget);
}
@ -3971,12 +3962,9 @@ QGLWidget::QGLWidget(const QGLFormat &format, QWidget *parent, const QGLWidget*
*/
QGLWidget::QGLWidget(QGLContext *context, QWidget *parent, const QGLWidget *shareWidget,
Qt::WindowFlags f)
: QWidget(*(new QGLWidgetPrivate), parent, f | Qt::MSWindowsOwnDC)
: QWidget(*(new QGLWidgetPrivate), parent, f)
{
Q_D(QGLWidget);
setAttribute(Qt::WA_PaintOnScreen);
setAttribute(Qt::WA_NoSystemBackground);
setAutoFillBackground(true); // for compatibility
d->init(context, shareWidget);
}
@ -5169,6 +5157,15 @@ QPaintEngine *QGLWidget::paintEngine() const
void QGLWidgetPrivate::init(QGLContext *context, const QGLWidget *shareWidget)
{
Q_Q(QGLWidget);
q->setAttribute(Qt::WA_PaintOnScreen);
q->setAttribute(Qt::WA_NoSystemBackground);
q->setAutoFillBackground(true); // for compatibility
mustHaveWindowHandle = 1;
q->setAttribute(Qt::WA_NativeWindow);
q->setWindowFlag(Qt::MSWindowsOwnDC);
initContext(context, shareWidget);
}