183QWidget *QWidget::createWindowContainer(QWindow *window, QWidget *parent, Qt::WindowFlags flags)
188 if (
auto *widgetWindow = qobject_cast<QWidgetWindow *>(window)) {
189 QWidget *widget = widgetWindow->widget();
190 if (flags != Qt::WindowFlags()) {
191 qWarning() << window <<
"refers to a widget:" << widget
192 <<
"WindowFlags" << flags <<
"will be ignored.";
194 widget->setParent(parent);
197 return new QWindowContainer(window, parent, flags);
204QWindowContainer::QWindowContainer(QWindow *embeddedWindow, QWidget *parent, Qt::WindowFlags flags)
205 : QWidget(*
new QWindowContainerPrivate, parent, flags)
207 Q_D(QWindowContainer);
208 if (Q_UNLIKELY(!embeddedWindow)) {
209 qWarning(
"QWindowContainer: embedded window cannot be null");
213 d->window = embeddedWindow;
214 d->window->installEventFilter(
this);
216 QString windowName = d->window->objectName();
217 if (windowName.isEmpty())
218 windowName = QString::fromUtf8(d->window->metaObject()->className());
219 d->fakeParent.setObjectName(windowName +
"ContainerFakeParent"_L1);
221 d->window->setParent(&d->fakeParent);
222 d->window->parent()->installEventFilter(
this);
223 d->window->setFlag(Qt::SubWindow);
225 setAcceptDrops(
true);
227 connect(containedWindow(), &QWindow::minimumHeightChanged,
this, &QWindowContainer::updateGeometry);
228 connect(containedWindow(), &QWindow::minimumWidthChanged,
this, &QWindowContainer::updateGeometry);
261bool QWindowContainer::eventFilter(QObject *o, QEvent *e)
263 Q_D(QWindowContainer);
267 if (e->type() == QEvent::ChildRemoved) {
268 QChildEvent *ce =
static_cast<QChildEvent *>(e);
269 if (ce->child() == d->window) {
270 o->removeEventFilter(
this);
271 d->window->removeEventFilter(
this);
274 }
else if (e->type() == QEvent::FocusIn) {
276 setFocus(Qt::ActiveWindowFocusReason);
285bool QWindowContainer::event(QEvent *e)
287 Q_D(QWindowContainer);
289 return QWidget::event(e);
291 QEvent::Type type = e->type();
301 case QEvent::PolishRequest:
305 d->updateUsesNativeWidgets();
306 if (d->isStillAnOrphan()) {
307 d->window->parent()->removeEventFilter(
this);
308 d->window->setParent(d->usesNativeWidgets
310 : window()->windowHandle());
311 d->fakeParent.destroy();
312 if (d->window->parent())
313 d->window->parent()->installEventFilter(
this);
315 if (d->window->parent()) {
316 d->markParentChain();
321 if (d->window->parent())
324 case QEvent::FocusIn:
325 if (d->window->parent()) {
326 if (QGuiApplication::focusWindow() != d->window) {
327 QFocusEvent *event =
static_cast<QFocusEvent *>(e);
328 const auto reason = event->reason();
329 QWindowPrivate::FocusTarget target = QWindowPrivate::FocusTarget::Current;
330 if (reason == Qt::TabFocusReason)
331 target = QWindowPrivate::FocusTarget::First;
332 else if (reason == Qt::BacktabFocusReason)
333 target = QWindowPrivate::FocusTarget::Last;
334 qt_window_private(d->window)->setFocusToTarget(target, reason);
335 d->window->requestActivate();
339#if QT_CONFIG(draganddrop)
341 case QEvent::DragMove:
342 case QEvent::DragLeave:
343 QCoreApplication::sendEvent(d->window, e);
344 return e->isAccepted();
345 case QEvent::DragEnter:
348 QCoreApplication::sendEvent(d->window, e);
355 static bool needsPunch = !QGuiApplicationPrivate::platformIntegration()->hasCapability(
356 QPlatformIntegration::TopStackedNativeChildWindows);
359 p.setCompositionMode(QPainter::CompositionMode_Source);
360 p.fillRect(rect(), Qt::transparent);
369 return QWidget::event(e);
391void QWindowContainer::toplevelAboutToBeDestroyed(QWidget *parent)
393 if (QWindowContainerPrivate *d = QWindowContainerPrivate::get(parent)) {
394 if (d->window->parent())
395 d->window->parent()->removeEventFilter(parent);
396 d->window->setParent(&d->fakeParent);
397 d->window->parent()->installEventFilter(parent);
399 qwindowcontainer_traverse(parent, toplevelAboutToBeDestroyed);
402void QWindowContainer::parentWasChanged(QWidget *parent)
404 if (QWindowContainerPrivate *d = QWindowContainerPrivate::get(parent)) {
405 if (d->window->parent()) {
406 d->updateUsesNativeWidgets();
407 d->markParentChain();
408 QWidget *toplevel = d->usesNativeWidgets ? parent : parent->window();
409 if (!toplevel->windowHandle()) {
410 QWidgetPrivate *tld =
static_cast<QWidgetPrivate *>(QWidgetPrivate::get(toplevel));
411 tld->createTLExtra();
412 tld->createTLSysExtra();
413 Q_ASSERT(toplevel->windowHandle());
415 d->window->parent()->removeEventFilter(parent);
416 d->window->setParent(toplevel->windowHandle());
417 toplevel->windowHandle()->installEventFilter(parent);
418 d->fakeParent.destroy();
422 qwindowcontainer_traverse(parent, parentWasChanged);