diff options
-rw-r--r-- | src/widgets/kernel/qwidget.cpp | 22 | ||||
-rw-r--r-- | tests/auto/widgets/graphicsview/qgraphicsproxywidget/tst_qgraphicsproxywidget.cpp | 28 |
2 files changed, 50 insertions, 0 deletions
diff --git a/src/widgets/kernel/qwidget.cpp b/src/widgets/kernel/qwidget.cpp index 455d195159..b421d5debc 100644 --- a/src/widgets/kernel/qwidget.cpp +++ b/src/widgets/kernel/qwidget.cpp @@ -12250,6 +12250,17 @@ QPaintEngine *QWidget::paintEngine() const */ QPoint QWidget::mapToGlobal(const QPoint &pos) const { +#ifndef QT_NO_GRAPHICSVIEW + Q_D(const QWidget); + if (d->extra && d->extra->proxyWidget) { + const QList <QGraphicsView *> views = d->extra->proxyWidget->scene()->views(); + if (!views.isEmpty()) { + const QPointF scenePos = d->extra->proxyWidget->mapToScene(pos); + const QPoint viewPortPos = views.first()->mapFromScene(scenePos); + return views.first()->viewport()->mapToGlobal(viewPortPos); + } + } +#endif // !QT_NO_GRAPHICSVIEW int x = pos.x(), y = pos.y(); const QWidget *w = this; while (w) { @@ -12274,6 +12285,17 @@ QPoint QWidget::mapToGlobal(const QPoint &pos) const */ QPoint QWidget::mapFromGlobal(const QPoint &pos) const { +#ifndef QT_NO_GRAPHICSVIEW + Q_D(const QWidget); + if (d->extra && d->extra->proxyWidget) { + const QList <QGraphicsView *> views = d->extra->proxyWidget->scene()->views(); + if (!views.isEmpty()) { + const QPoint viewPortPos = views.first()->viewport()->mapFromGlobal(pos); + const QPointF scenePos = views.first()->mapToScene(viewPortPos); + return d->extra->proxyWidget->mapFromScene(scenePos).toPoint(); + } + } +#endif // !QT_NO_GRAPHICSVIEW int x = pos.x(), y = pos.y(); const QWidget *w = this; while (w) { diff --git a/tests/auto/widgets/graphicsview/qgraphicsproxywidget/tst_qgraphicsproxywidget.cpp b/tests/auto/widgets/graphicsview/qgraphicsproxywidget/tst_qgraphicsproxywidget.cpp index ab84c9e482..66d0f64ceb 100644 --- a/tests/auto/widgets/graphicsview/qgraphicsproxywidget/tst_qgraphicsproxywidget.cpp +++ b/tests/auto/widgets/graphicsview/qgraphicsproxywidget/tst_qgraphicsproxywidget.cpp @@ -174,6 +174,7 @@ private slots: void clickFocus(); void windowFrameMargins(); void QTBUG_6986_sendMouseEventToAlienWidget(); + void mapToGlobal(); }; // Subclass that exposes the protected functions. @@ -3659,5 +3660,32 @@ void tst_QGraphicsProxyWidget::QTBUG_6986_sendMouseEventToAlienWidget() QTRY_COMPARE(scene.hoverButton->hoverLeaveReceived, true); } +void tst_QGraphicsProxyWidget::mapToGlobal() // QTBUG-41135 +{ + const QRect availableGeometry = QGuiApplication::primaryScreen()->availableGeometry(); + const QSize size = availableGeometry.size() / 5; + QGraphicsScene scene; + QGraphicsView view(&scene); + view.setWindowTitle(QTest::currentTestFunction()); + view.resize(size); + view.move(availableGeometry.bottomRight() - QPoint(size.width(), size.height()) - QPoint(100, 100)); + QWidget *embeddedWidget = new QWidget; + embeddedWidget->setFixedSize(size / 2); + scene.addWidget(embeddedWidget); + QApplication::setActiveWindow(&view); + view.show(); + QVERIFY(QTest::qWaitForWindowExposed(&view)); + const QPoint embeddedCenter = embeddedWidget->geometry().center(); + const QPoint embeddedCenterGlobal = embeddedWidget->mapToGlobal(embeddedCenter); + QCOMPARE(embeddedWidget->mapFromGlobal(embeddedCenterGlobal), embeddedCenter); + // This should be equivalent to the view center give or take rounding + // errors due to odd window margins + const QPoint viewCenter = view.geometry().center(); + QVERIFY2((viewCenter - embeddedCenterGlobal).manhattanLength() <= 2, + qPrintable(QStringLiteral("%1, %2 != %3, %4") + .arg(viewCenter.x()).arg(viewCenter.y()) + .arg(embeddedCenterGlobal.x()).arg(embeddedCenterGlobal.y()))); +} + QTEST_MAIN(tst_QGraphicsProxyWidget) #include "tst_qgraphicsproxywidget.moc" |