summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/gui/kernel/qwindow.cpp61
-rw-r--r--src/gui/kernel/qwindow.h13
-rw-r--r--src/gui/kernel/qwindow_p.h7
3 files changed, 81 insertions, 0 deletions
diff --git a/src/gui/kernel/qwindow.cpp b/src/gui/kernel/qwindow.cpp
index 2117835609..8b37fce50c 100644
--- a/src/gui/kernel/qwindow.cpp
+++ b/src/gui/kernel/qwindow.cpp
@@ -59,6 +59,7 @@
#include <QtCore/QDebug>
#include <QStyleHints>
+#include <QPlatformCursor>
QT_BEGIN_NAMESPACE
@@ -1684,4 +1685,64 @@ void QWindowPrivate::maybeQuitOnLastWindowClosed()
}
+/*!
+ \property QWindow::cursor
+ \brief the cursor shape for this window
+
+ The mouse cursor will assume this shape when it is over this
+ window, unless an override cursor is set. See the \link
+ Qt::CursorShape list of predefined cursor objects\endlink for a
+ range of useful shapes.
+
+ By default, this property contains a cursor with the Qt::ArrowCursor
+ shape.
+
+ Some underlying window implementations will reset the cursor if it
+ leaves a window even if the mouse is grabbed. If you want to have
+ a cursor set for all windows, even when outside the window, consider
+ QGuiApplication::setOverrideCursor().
+
+ \sa QGuiApplication::setOverrideCursor()
+*/
+
+#ifndef QT_NO_CURSOR
+QCursor QWindow::cursor() const
+{
+ Q_D(const QWindow);
+ return d->cursor;
+}
+
+void QWindow::setCursor(const QCursor &cursor)
+{
+ Q_D(QWindow);
+ if (QPlatformCursor *platformCursor = d->screen->handle()->cursor()) {
+ d->cursor = cursor;
+ QCursor *oc = QGuiApplication::overrideCursor();
+ QCursor c = oc ? *oc : d->cursor;
+ platformCursor->changeCursor(&c, this);
+ QEvent event(QEvent::CursorChange);
+ QGuiApplication::sendEvent(this, &event);
+ }
+}
+
+/*!
+ \brief Restores the default arrow cursor for this window.
+ */
+void QWindow::unsetCursor()
+{
+ Q_D(QWindow);
+ if (QPlatformCursor *platformCursor = d->screen->handle()->cursor()) {
+ d->cursor = Qt::ArrowCursor;
+ QCursor *oc = QGuiApplication::overrideCursor();
+ if (!oc) {
+ QCursor c = d->cursor;
+ platformCursor->changeCursor(&c, this);
+ }
+ QEvent event(QEvent::CursorChange);
+ QGuiApplication::sendEvent(this, &event);
+ }
+}
+
+#endif
+
QT_END_NAMESPACE
diff --git a/src/gui/kernel/qwindow.h b/src/gui/kernel/qwindow.h
index e99c062158..57c2f6f755 100644
--- a/src/gui/kernel/qwindow.h
+++ b/src/gui/kernel/qwindow.h
@@ -53,6 +53,10 @@
#include <QtGui/qsurfaceformat.h>
#include <QtGui/qwindowdefs.h>
+#ifndef QT_NO_CURSOR
+#include <QtGui/qcursor.h>
+#endif
+
QT_BEGIN_HEADER
QT_BEGIN_NAMESPACE
@@ -92,6 +96,9 @@ class Q_GUI_EXPORT QWindow : public QObject, public QSurface
Q_PROPERTY(int height READ height WRITE setHeight NOTIFY heightChanged)
Q_PROPERTY(bool visible READ isVisible WRITE setVisible NOTIFY visibleChanged)
Q_PROPERTY(Qt::ScreenOrientation contentOrientation READ contentOrientation WRITE reportContentOrientationChange NOTIFY contentOrientationChanged)
+#ifndef QT_NO_CURSOR
+ Q_PROPERTY(QCursor cursor READ cursor WRITE setCursor RESET unsetCursor)
+#endif
public:
@@ -205,6 +212,12 @@ public:
QPoint mapToGlobal(const QPoint &pos) const;
QPoint mapFromGlobal(const QPoint &pos) const;
+#ifndef QT_NO_CURSOR
+ QCursor cursor() const;
+ void setCursor(const QCursor &);
+ void unsetCursor();
+#endif
+
public Q_SLOTS:
void setVisible(bool visible);
diff --git a/src/gui/kernel/qwindow_p.h b/src/gui/kernel/qwindow_p.h
index 375bd1e729..0afd903ead 100644
--- a/src/gui/kernel/qwindow_p.h
+++ b/src/gui/kernel/qwindow_p.h
@@ -84,6 +84,9 @@ public:
, blockedByModalWindow(false)
, transientParent(0)
, screen(0)
+#ifndef QT_NO_CURSOR
+ , cursor(Qt::ArrowCursor)
+#endif
{
isWindow = true;
}
@@ -128,6 +131,10 @@ public:
QPointer<QWindow> transientParent;
QScreen *screen;
+
+#ifndef QT_NO_CURSOR
+ QCursor cursor;
+#endif
};