void QQuickPopupWindow::show() { qreal posx = x(); qreal posy = y(); // transientParent may not be a QQuickWindow when embedding into widgets if (QWindow *tp = transientParent()) { if (m_parentItem) { QPointF pos = m_parentItem->mapToItem(m_parentItem->window()->contentItem(), QPointF(posx, posy)); posx = pos.x(); posy = pos.y(); } QPoint tlwOffset = tp->mapToGlobal(QPoint()); posx += tlwOffset.x(); posy += tlwOffset.y(); } else if (m_parentItem && m_parentItem->window()) { QPoint offset; QQuickWindow *quickWindow = m_parentItem->window(); QWindow *renderWindow = QQuickRenderControl::renderWindowFor(quickWindow, &offset); QPointF pos = m_parentItem->mapToItem(quickWindow->contentItem(), QPointF(posx, posy)); posx = pos.x(); posy = pos.y(); QPoint parentWindowOffset = (renderWindow ? renderWindow : quickWindow)->mapToGlobal(QPoint()); posx += offset.x() + parentWindowOffset.x(); posy += offset.y() + parentWindowOffset.y(); } if (m_contentItem) { qreal initialWidth = qMax(qreal(1), m_contentItem->width()); qreal initialHeight = qMax(qreal(1), m_contentItem->height()); setGeometry(posx, posy, initialWidth, initialHeight); } else { setPosition(posx, posy); } emit geometryChanged(); if (!qobject_cast<QQuickPopupWindow *>(transientParent())) { // No need for parent menu windows if (QQuickWindow *w = qobject_cast<QQuickWindow *>(transientParent())) { if (QQuickItem *mg = w->mouseGrabberItem()) mg->ungrabMouse(); } else if (m_parentItem && m_parentItem->window()) { if (QQuickItem *mg = m_parentItem->window()->mouseGrabberItem()) mg->ungrabMouse(); } } QQuickWindow::show(); setMouseGrabEnabled(true); // Needs to be done after calling show() setKeyboardGrabEnabled(true); }
void QQuickPopupWindow::show() { qreal posx = x(); qreal posy = y(); if (QQuickWindow *parentWindow = qobject_cast<QQuickWindow *>(transientParent())) { if (m_parentItem) { QPointF pos = m_parentItem->mapToItem(parentWindow->contentItem(), QPointF(posx, posy)); posx = pos.x(); posy = pos.y(); } if (parentWindow->parent()) { // If the parent window is embedded in another window, the offset needs to be relative to // its top-level window container, or to global coordinates, which is the same in the end. QPoint parentWindowOffset = parentWindow->mapToGlobal(QPoint()); posx += parentWindowOffset.x(); posy += parentWindowOffset.y(); } else { posx += parentWindow->geometry().left(); posy += parentWindow->geometry().top(); } } if (m_contentItem) { qreal initialWidth = qMax(qreal(1), m_contentItem->width()); qreal initialHeight = qMax(qreal(1), m_contentItem->height()); setGeometry(posx, posy, initialWidth, initialHeight); } else { setPosition(posx, posy); } if (!qobject_cast<QQuickPopupWindow *>(transientParent())) // No need for parent menu windows if (QQuickWindow *w = qobject_cast<QQuickWindow *>(transientParent())) if (QQuickItem *mg = w->mouseGrabberItem()) mg->ungrabMouse(); QQuickWindow::show(); setMouseGrabEnabled(true); // Needs to be done after calling show() setKeyboardGrabEnabled(true); }