summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/widgets/kernel/qwindowcontainer.cpp11
-rw-r--r--tests/auto/widgets/kernel/qwindowcontainer/tst_qwindowcontainer.cpp18
2 files changed, 27 insertions, 2 deletions
diff --git a/src/widgets/kernel/qwindowcontainer.cpp b/src/widgets/kernel/qwindowcontainer.cpp
index 3885431b05..e8c4a763ee 100644
--- a/src/widgets/kernel/qwindowcontainer.cpp
+++ b/src/widgets/kernel/qwindowcontainer.cpp
@@ -84,6 +84,11 @@ public:
if (usesNativeWidgets || window->parent() == 0)
return;
Q_Q(QWindowContainer);
+ if (q->internalWinId()) {
+ // Allow use native widgets if the window container is already a native widget
+ usesNativeWidgets = true;
+ return;
+ }
QWidget *p = q->parentWidget();
while (p) {
if (
@@ -147,8 +152,10 @@ public:
as a child of a QAbstractScrollArea or QMdiArea, it will
create a \l {Native Widgets vs Alien Widgets} {native window} for
every widget in its parent chain to allow for proper stacking and
- clipping in this use case. Applications with many native child
- windows may suffer from performance issues.
+ clipping in this use case. Creating a native window for the window
+ container also allows for proper stacking and clipping. This must
+ be done before showing the window container. Applications with
+ many native child windows may suffer from performance issues.
The window container has a number of known limitations:
diff --git a/tests/auto/widgets/kernel/qwindowcontainer/tst_qwindowcontainer.cpp b/tests/auto/widgets/kernel/qwindowcontainer/tst_qwindowcontainer.cpp
index dfc53c9164..94b3f9089f 100644
--- a/tests/auto/widgets/kernel/qwindowcontainer/tst_qwindowcontainer.cpp
+++ b/tests/auto/widgets/kernel/qwindowcontainer/tst_qwindowcontainer.cpp
@@ -81,6 +81,7 @@ private slots:
void testActivation();
void testAncestorChange();
void testDockWidget();
+ void testNativeContainerParent();
void cleanup();
private:
@@ -330,6 +331,23 @@ void tst_QWindowContainer::testDockWidget()
QTRY_COMPARE(window->parent(), mainWindow.window()->windowHandle());
}
+void tst_QWindowContainer::testNativeContainerParent()
+{
+ QWidget root;
+ root.setWindowTitle(QTest::currentTestFunction());
+ root.setGeometry(m_availableGeometry.x() + 50, m_availableGeometry.y() + 50, 200, 200);
+
+ Window *window = new Window();
+ QWidget *container = QWidget::createWindowContainer(window, &root);
+ container->setAttribute(Qt::WA_NativeWindow);
+ container->setGeometry(50, 50, 150, 150);
+
+ root.show();
+
+ QVERIFY(QTest::qWaitForWindowExposed(window));
+ QTRY_COMPARE(window->parent(), container->windowHandle());
+}
+
QTEST_MAIN(tst_QWindowContainer)
#include "tst_qwindowcontainer.moc"