diff options
-rw-r--r-- | src/widgets/kernel/qwidget.cpp | 6 | ||||
-rw-r--r-- | tests/auto/widgets/kernel/qwidget_window/qwidget_window.pro | 2 | ||||
-rw-r--r-- | tests/auto/widgets/kernel/qwidget_window/tst_qwidget_window.cpp | 31 |
3 files changed, 38 insertions, 1 deletions
diff --git a/src/widgets/kernel/qwidget.cpp b/src/widgets/kernel/qwidget.cpp index 65978ef562..8d1a24a4ec 100644 --- a/src/widgets/kernel/qwidget.cpp +++ b/src/widgets/kernel/qwidget.cpp @@ -9042,6 +9042,12 @@ bool QWidget::event(QEvent *event) event->ignore(); break; #endif + case QEvent::ScreenChangeInternal: + if (const QTLWExtra *te = d->maybeTopData()) { + const QWindow *win = te->window; + d->setWinId((win && win->handle()) ? win->handle()->winId() : 0); + } + break; #ifndef QT_NO_PROPERTIES case QEvent::DynamicPropertyChange: { const QByteArray &propName = static_cast<QDynamicPropertyChangeEvent *>(event)->propertyName(); diff --git a/tests/auto/widgets/kernel/qwidget_window/qwidget_window.pro b/tests/auto/widgets/kernel/qwidget_window/qwidget_window.pro index baa2823f9a..d61681d5cb 100644 --- a/tests/auto/widgets/kernel/qwidget_window/qwidget_window.pro +++ b/tests/auto/widgets/kernel/qwidget_window/qwidget_window.pro @@ -1,7 +1,7 @@ CONFIG += testcase CONFIG += parallel_test TARGET = tst_qwidget_window -QT += widgets testlib +QT += widgets testlib core-private gui-private SOURCES += tst_qwidget_window.cpp x11 { diff --git a/tests/auto/widgets/kernel/qwidget_window/tst_qwidget_window.cpp b/tests/auto/widgets/kernel/qwidget_window/tst_qwidget_window.cpp index 8084d50fbe..f9d705de26 100644 --- a/tests/auto/widgets/kernel/qwidget_window/tst_qwidget_window.cpp +++ b/tests/auto/widgets/kernel/qwidget_window/tst_qwidget_window.cpp @@ -52,6 +52,8 @@ #include <qlistwidget.h> #include <qpushbutton.h> #include <qboxlayout.h> +#include <qlabel.h> +#include <private/qwindow_p.h> static inline void setFrameless(QWidget *w) { @@ -97,6 +99,7 @@ private slots: #endif void tst_qtbug35600(); + void tst_updateWinId_QTBUG40681(); }; void tst_QWidget_window::initTestCase() @@ -603,5 +606,33 @@ void tst_QWidget_window::tst_qtbug35600() // QTBUG-35600: program may crash here or on exit } +void tst_QWidget_window::tst_updateWinId_QTBUG40681() +{ + QWidget w; + QVBoxLayout *vl = new QVBoxLayout(&w); + QLabel *lbl = new QLabel("HELLO1"); + lbl->setAttribute(Qt::WA_NativeWindow); + lbl->setObjectName("label1"); + vl->addWidget(lbl); + w.setMinimumWidth(200); + + w.show(); + + QVERIFY(QTest::qWaitForWindowExposed(&w)); + + QCOMPARE(lbl->winId(), lbl->windowHandle()->winId()); + + // simulate screen change and notification + QWindow *win = w.windowHandle(); + w.windowHandle()->destroy(); + lbl->windowHandle()->destroy(); + w.windowHandle()->create(); + lbl->windowHandle()->create(); + QWindowPrivate *p = qt_window_private(win); + p->emitScreenChangedRecursion(win->screen()); + + QCOMPARE(lbl->winId(), lbl->windowHandle()->winId()); +} + QTEST_MAIN(tst_QWidget_window) #include "tst_qwidget_window.moc" |