Fix setting custom cursor for widgets and windows before showing them

If custom cursor was set before the window was created, it didn't
actually get set, and in some cases even caused a crash.
Fixed by making sure the cursor is correct when showing widget/window.

Task-number: QTBUG-27535
Change-Id: I3bc946a9c406c96af5b86869a3a54893f8980aba
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@digia.com>
Reviewed-by: Gatis Paeglis <gatis.paeglis@digia.com>
Reviewed-by: Samuel Rødal <samuel.rodal@digia.com>
bb10
Miikka Heikkinen 2012-10-15 14:17:01 +03:00 committed by The Qt Project
parent c92ceb179f
commit 74230f126b
3 changed files with 26 additions and 16 deletions

View File

@ -286,6 +286,10 @@ void QWindow::setVisible(bool visible)
QGuiApplicationPrivate::hideModalWindow(this);
}
#ifndef QT_NO_CURSOR
if (visible)
d->applyCursor();
#endif
d->platformWindow->setVisible(visible);
if (!visible) {
@ -1853,11 +1857,10 @@ QCursor QWindow::cursor() const
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);
d->cursor = cursor;
// Only attempt to set cursor and emit signal if there is an actual platform cursor
if (d->screen->handle()->cursor()) {
d->applyCursor();
QEvent event(QEvent::CursorChange);
QGuiApplication::sendEvent(this, &event);
}
@ -1868,19 +1871,20 @@ void QWindow::setCursor(const QCursor &cursor)
*/
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);
}
setCursor(Qt::ArrowCursor);
}
void QWindowPrivate::applyCursor()
{
Q_Q(QWindow);
if (platformWindow) {
if (QPlatformCursor *platformCursor = screen->handle()->cursor()) {
QCursor *oc = QGuiApplication::overrideCursor();
QCursor c = oc ? *oc : cursor;
platformCursor->changeCursor(&c, q);
}
}
}
#endif
QT_END_NAMESPACE

View File

@ -97,6 +97,9 @@ public:
}
void maybeQuitOnLastWindowClosed();
#ifndef QT_NO_CURSOR
void applyCursor();
#endif
QPoint globalPosition() const {
Q_Q(const QWindow);

View File

@ -547,6 +547,9 @@ void QWidgetPrivate::show_sys()
}
}
#ifndef QT_NO_CURSOR
qt_qpa_set_cursor(q, false); // Needed in case cursor was set before show
#endif
invalidateBuffer(q->rect());
window->setVisible(true);
}