Fix moving a hidden QOpenGLWidget to another window
A visibile QOpenGLWidget receives a QEvent::WindowChangeInternal which triggers a QOpenGLWidget::reset(). A hidden QOpenGLWidget never received this event so it was never reset, resulting in a black rendering. Includes unit-test that fails without this patch. Change-Id: I9d2c57d66fa629f631a9829a5ebf4de09998ad75 Task-Id: QTBUG-60896 Reviewed-by: Laszlo Agocs <laszlo.agocs@qt.io>bb10
parent
628f3becf9
commit
fd897629bf
|
|
@ -1342,6 +1342,8 @@ bool QOpenGLWidget::event(QEvent *e)
|
|||
break;
|
||||
if (d->initialized)
|
||||
d->reset();
|
||||
if (isHidden())
|
||||
break;
|
||||
// FALLTHROUGH
|
||||
case QEvent::Show: // reparenting may not lead to a resize so reinitalize on Show too
|
||||
if (!d->initialized && !size().isEmpty() && window() && window()->windowHandle()) {
|
||||
|
|
|
|||
|
|
@ -10511,7 +10511,7 @@ static void sendWindowChangeToTextureChildrenRecursively(QWidget *widget)
|
|||
|
||||
for (int i = 0; i < d->children.size(); ++i) {
|
||||
QWidget *w = qobject_cast<QWidget *>(d->children.at(i));
|
||||
if (w && !w->isWindow() && !w->isHidden() && QWidgetPrivate::get(w)->textureChildSeen)
|
||||
if (w && !w->isWindow() && QWidgetPrivate::get(w)->textureChildSeen)
|
||||
sendWindowChangeToTextureChildrenRecursively(w);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -55,6 +55,7 @@ private slots:
|
|||
void painter();
|
||||
void reparentToAlreadyCreated();
|
||||
void reparentToNotYetCreated();
|
||||
void reparentHidden();
|
||||
void asViewport();
|
||||
void requestUpdate();
|
||||
void fboRedirect();
|
||||
|
|
@ -279,6 +280,36 @@ void tst_QOpenGLWidget::reparentToNotYetCreated()
|
|||
QVERIFY(image.pixel(20, 10) == qRgb(0, 0, 255));
|
||||
}
|
||||
|
||||
void tst_QOpenGLWidget::reparentHidden()
|
||||
{
|
||||
// Tests QTBUG-60896
|
||||
QWidget topLevel1;
|
||||
|
||||
QWidget *container = new QWidget(&topLevel1);
|
||||
PainterWidget *glw = new PainterWidget(container);
|
||||
topLevel1.resize(640, 480);
|
||||
glw->resize(320, 200);
|
||||
topLevel1.show();
|
||||
|
||||
glw->hide(); // Explicitly hidden
|
||||
|
||||
QTest::qWaitForWindowExposed(&topLevel1);
|
||||
|
||||
QWidget topLevel2;
|
||||
topLevel2.resize(640, 480);
|
||||
topLevel2.show();
|
||||
QTest::qWaitForWindowExposed(&topLevel2);
|
||||
|
||||
QOpenGLContext *originalContext = glw->context();
|
||||
QVERIFY(originalContext);
|
||||
|
||||
container->setParent(&topLevel2);
|
||||
glw->show(); // Should get a new context now
|
||||
|
||||
QOpenGLContext *newContext = glw->context();
|
||||
QVERIFY(originalContext != newContext);
|
||||
}
|
||||
|
||||
class CountingGraphicsView : public QGraphicsView
|
||||
{
|
||||
public:
|
||||
|
|
|
|||
Loading…
Reference in New Issue