From a001bde5bfc8b782231d7f9c42dbeb82ff25fc81 Mon Sep 17 00:00:00 2001 From: Gunnar Sletta Date: Mon, 29 Aug 2011 08:26:37 +0200 Subject: QWindow::mapToGlobal/mapFromGlobal and move() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: If1909b9ce468a8708cb25d5a2fbe8ebd90bd958a Reviewed-on: http://codereview.qt.nokia.com/3702 Reviewed-by: Qt Sanity Bot Reviewed-by: Samuel Rødal --- src/gui/kernel/qwindow.cpp | 35 ++++++++++++++++++ src/gui/kernel/qwindow.h | 7 ++++ src/gui/kernel/qwindow_p.h | 9 +++++ tests/auto/qwindow/qwindow.pro | 6 ++++ tests/auto/qwindow/tst_qwindow.cpp | 74 ++++++++++++++++++++++++++++++++++++++ 5 files changed, 131 insertions(+) create mode 100644 tests/auto/qwindow/qwindow.pro create mode 100644 tests/auto/qwindow/tst_qwindow.cpp diff --git a/src/gui/kernel/qwindow.cpp b/src/gui/kernel/qwindow.cpp index d850cd6020..6fbc249631 100644 --- a/src/gui/kernel/qwindow.cpp +++ b/src/gui/kernel/qwindow.cpp @@ -631,6 +631,41 @@ void QWindow::wheelEvent(QWheelEvent *) } #endif //QT_NO_WHEELEVENT + + +/*! + \fn QPoint QWindow::mapToGlobal(const QPoint &pos) const + + Translates the window coordinate \a pos to global screen + coordinates. For example, \c{mapToGlobal(QPoint(0,0))} would give + the global coordinates of the top-left pixel of the window. + + \sa mapFromGlobal() +*/ + +QPoint QWindow::mapToGlobal(const QPoint &pos) const +{ + return pos + d_func()->globalPosition(); +} + + + +/*! + \fn QPoint QWindow::mapFromGlobal(const QPoint &pos) const + + Translates the global screen coordinate \a pos to window + coordinates. + + \sa mapToGlobal() +*/ + +QPoint QWindow::mapFromGlobal(const QPoint &pos) const +{ + return pos - d_func()->globalPosition(); +} + + + Q_GUI_EXPORT QWindowPrivate *qt_window_private(QWindow *window) { return window->d_func(); diff --git a/src/gui/kernel/qwindow.h b/src/gui/kernel/qwindow.h index 6c8fda5768..c64ad13363 100644 --- a/src/gui/kernel/qwindow.h +++ b/src/gui/kernel/qwindow.h @@ -155,6 +155,7 @@ public: void setBaseSize(const QSize &size); void setSizeIncrement(const QSize &size); + void setGeometry(int x, int y, int w, int h) { setGeometry(QRect(x, y, w, h)); } void setGeometry(const QRect &rect); QRect geometry() const; @@ -166,6 +167,9 @@ public: inline QSize size() const { return geometry().size(); } inline QPoint pos() const { return geometry().topLeft(); } + inline void move(const QPoint &pt) { setGeometry(QRect(pt, size())); } + inline void move(int x, int y) { move(QPoint(x, y)); } + inline void resize(const QSize &size) { setGeometry(QRect(pos(), size)); } inline void resize(int w, int h) { setGeometry(QRect(x(), y(), w, h)); } @@ -183,6 +187,9 @@ public: QScreen *screen() const; void setScreen(QScreen *screen); + QPoint mapToGlobal(const QPoint &pos) const; + QPoint mapFromGlobal(const QPoint &pos) const; + public Q_SLOTS: inline void show() { setVisible(true); } inline void hide() { setVisible(false); } diff --git a/src/gui/kernel/qwindow_p.h b/src/gui/kernel/qwindow_p.h index 0a051ae965..38b90fdd73 100644 --- a/src/gui/kernel/qwindow_p.h +++ b/src/gui/kernel/qwindow_p.h @@ -81,6 +81,15 @@ public: void maybeQuitOnLastWindowClosed(); + QPoint globalPosition() const { + Q_Q(const QWindow); + QPoint offset = q->pos(); + for (const QWindow *p = q->parent(); p; p = p->parent()) + offset += p->pos(); + return offset; + } + + QWindow::SurfaceType surfaceType; Qt::WindowFlags windowFlags; QWindow *parentWindow; diff --git a/tests/auto/qwindow/qwindow.pro b/tests/auto/qwindow/qwindow.pro new file mode 100644 index 0000000000..560945322c --- /dev/null +++ b/tests/auto/qwindow/qwindow.pro @@ -0,0 +1,6 @@ +load(qttest_p4) + +QT += core-private gui-private + +SOURCES += tst_qwindow.cpp + diff --git a/tests/auto/qwindow/tst_qwindow.cpp b/tests/auto/qwindow/tst_qwindow.cpp new file mode 100644 index 0000000000..77e3d5f88c --- /dev/null +++ b/tests/auto/qwindow/tst_qwindow.cpp @@ -0,0 +1,74 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** GNU Lesser General Public License Usage +** This file may be used under the terms of the GNU Lesser General Public +** License version 2.1 as published by the Free Software Foundation and +** appearing in the file LICENSE.LGPL included in the packaging of this +** file. Please review the following information to ensure the GNU Lesser +** General Public License version 2.1 requirements will be met: +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include +#include + +class tst_QWindow: public QObject +{ + Q_OBJECT + +private slots: + void mapGlobal(); +}; + + +void tst_QWindow::mapGlobal() +{ + QWindow a; + QWindow b(&a); + QWindow c(&b); + + a.setGeometry(10, 10, 300, 300); + b.setGeometry(20, 20, 200, 200); + c.setGeometry(40, 40, 100, 100); + + QCOMPARE(a.mapToGlobal(QPoint(100, 100)), QPoint(110, 110)); + QCOMPARE(b.mapToGlobal(QPoint(100, 100)), QPoint(130, 130)); + QCOMPARE(c.mapToGlobal(QPoint(100, 100)), QPoint(170, 170)); + + QCOMPARE(a.mapFromGlobal(QPoint(100, 100)), QPoint(90, 90)); + QCOMPARE(b.mapFromGlobal(QPoint(100, 100)), QPoint(70, 70)); + QCOMPARE(c.mapFromGlobal(QPoint(100, 100)), QPoint(30, 30)); +} + +#include +QTEST_MAIN(tst_QWindow); -- cgit v1.2.3