184QWidget *QWidget::createWindowContainer(QWindow *window, QWidget *parent, Qt::WindowFlags flags)
189 if (
auto *widgetWindow = qobject_cast<QWidgetWindow *>(window)) {
190 QWidget *widget = widgetWindow->widget();
191 if (flags != Qt::WindowFlags()) {
192 qWarning() << window <<
"refers to a widget:" << widget
193 <<
"WindowFlags" << flags <<
"will be ignored.";
195 widget->setParent(parent);
198 return new QWindowContainer(window, parent, flags);
205QWindowContainer::QWindowContainer(QWindow *embeddedWindow, QWidget *parent, Qt::WindowFlags flags)
206 : QWidget(*
new QWindowContainerPrivate, parent, flags)
208 Q_D(QWindowContainer);
209 if (Q_UNLIKELY(!embeddedWindow)) {
210 qWarning(
"QWindowContainer: embedded window cannot be null");
214 d->window = embeddedWindow;
215 d->window->installEventFilter(
this);
217 QString windowName = d->window->objectName();
218 if (windowName.isEmpty())
219 windowName = QString::fromUtf8(d->window->metaObject()->className());
220 d->fakeParent.setObjectName(windowName +
"ContainerFakeParent"_L1);
222 d->window->setParent(&d->fakeParent);
223 d->window->parent()->installEventFilter(
this);
224 d->window->setFlag(Qt::SubWindow);
226 setAcceptDrops(
true);
228 connect(containedWindow(), &QWindow::minimumHeightChanged,
this, &QWindowContainer::updateGeometry);
229 connect(containedWindow(), &QWindow::minimumWidthChanged,
this, &QWindowContainer::updateGeometry);
262bool QWindowContainer::eventFilter(QObject *o, QEvent *e)
264 Q_D(QWindowContainer);
268 if (e->type() == QEvent::ChildRemoved) {
269 QChildEvent *ce =
static_cast<QChildEvent *>(e);
270 if (ce->child() == d->window) {
271 o->removeEventFilter(
this);
272 d->window->removeEventFilter(
this);
275 }
else if (e->type() == QEvent::FocusIn) {
277 setFocus(Qt::ActiveWindowFocusReason);
286bool QWindowContainer::event(QEvent *e)
288 Q_D(QWindowContainer);
290 return QWidget::event(e);
292 QEvent::Type type = e->type();
302 case QEvent::PolishRequest:
306 d->updateUsesNativeWidgets();
307 if (d->isStillAnOrphan()) {
308 d->window->parent()->removeEventFilter(
this);
309 d->window->setParent(d->usesNativeWidgets
311 : window()->windowHandle());
312 d->fakeParent.destroy();
313 if (d->window->parent())
314 d->window->parent()->installEventFilter(
this);
316 if (d->window->parent()) {
317 d->markParentChain();
322 if (d->window->parent())
325 case QEvent::FocusIn:
326 if (d->window->parent()) {
327 if (QGuiApplication::focusWindow() != d->window) {
328 QFocusEvent *event =
static_cast<QFocusEvent *>(e);
329 const auto reason = event->reason();
330 QWindowPrivate::FocusTarget target = QWindowPrivate::FocusTarget::Current;
331 if (reason == Qt::TabFocusReason)
332 target = QWindowPrivate::FocusTarget::First;
333 else if (reason == Qt::BacktabFocusReason)
334 target = QWindowPrivate::FocusTarget::Last;
335 qt_window_private(d->window)->setFocusToTarget(target, reason);
336 d->window->requestActivate();
340#if QT_CONFIG(draganddrop)
342 case QEvent::DragMove:
343 case QEvent::DragLeave:
344 QCoreApplication::sendEvent(d->window, e);
345 return e->isAccepted();
346 case QEvent::DragEnter:
349 QCoreApplication::sendEvent(d->window, e);
356 static bool needsPunch = !QGuiApplicationPrivate::platformIntegration()->hasCapability(
357 QPlatformIntegration::TopStackedNativeChildWindows);
360 p.setCompositionMode(QPainter::CompositionMode_Source);
361 p.fillRect(rect(), Qt::transparent);
370 return QWidget::event(e);
392void QWindowContainer::toplevelAboutToBeDestroyed(QWidget *parent)
394 if (QWindowContainerPrivate *d = QWindowContainerPrivate::get(parent)) {
395 if (d->window->parent())
396 d->window->parent()->removeEventFilter(parent);
397 d->window->setParent(&d->fakeParent);
398 d->window->parent()->installEventFilter(parent);
400 qwindowcontainer_traverse(parent, toplevelAboutToBeDestroyed);
403void QWindowContainer::parentWasChanged(QWidget *parent)
405 if (QWindowContainerPrivate *d = QWindowContainerPrivate::get(parent)) {
406 if (d->window->parent()) {
407 d->updateUsesNativeWidgets();
408 d->markParentChain();
409 QWidget *toplevel = d->usesNativeWidgets ? parent : parent->window();
410 if (!toplevel->windowHandle()) {
411 QWidgetPrivate *tld =
static_cast<QWidgetPrivate *>(QWidgetPrivate::get(toplevel));
412 tld->createTLExtra();
413 tld->createTLSysExtra();
414 Q_ASSERT(toplevel->windowHandle());
416 d->window->parent()->removeEventFilter(parent);
417 d->window->setParent(toplevel->windowHandle());
418 toplevel->windowHandle()->installEventFilter(parent);
419 d->fakeParent.destroy();
423 qwindowcontainer_traverse(parent, parentWasChanged);