From 15339939efd870805acb2709ad19f4555c8a478f Mon Sep 17 00:00:00 2001 From: Roman Telezhynskyi Date: Fri, 12 Jan 2018 14:31:45 +0200 Subject: [PATCH] Fix QGraphicsView cursor regression. --HG-- branch : develop --- src/libs/vmisc/def.cpp | 14 +++++++++----- src/libs/vmisc/def.h | 1 + src/libs/vwidgets/vmaingraphicsview.cpp | 15 ++++++++++----- 3 files changed, 20 insertions(+), 10 deletions(-) diff --git a/src/libs/vmisc/def.cpp b/src/libs/vmisc/def.cpp index 976d9f405..9216eaac7 100644 --- a/src/libs/vmisc/def.cpp +++ b/src/libs/vmisc/def.cpp @@ -208,11 +208,8 @@ const QString unitINCH = QStringLiteral("inch"); const QString unitPX = QStringLiteral("px"); //--------------------------------------------------------------------------------------------------------------------- -void SetItemOverrideCursor(QGraphicsItem *item, const QString &pixmapPath, int hotX, int hotY) +QPixmap QPixmapFromCache(const QString &pixmapPath) { -#ifndef QT_NO_CURSOR - SCASSERT(item != nullptr) - QPixmap pixmap; if (not QPixmapCache::find(pixmapPath, pixmap)) @@ -220,8 +217,15 @@ void SetItemOverrideCursor(QGraphicsItem *item, const QString &pixmapPath, int h pixmap = QPixmap(pixmapPath); QPixmapCache::insert(pixmapPath, pixmap); } + return pixmap; +} - item->setCursor(QCursor(pixmap, hotX, hotY)); +//--------------------------------------------------------------------------------------------------------------------- +void SetItemOverrideCursor(QGraphicsItem *item, const QString &pixmapPath, int hotX, int hotY) +{ +#ifndef QT_NO_CURSOR + SCASSERT(item != nullptr) + item->setCursor(QCursor(QPixmapFromCache(pixmapPath), hotX, hotY)); #else Q_UNUSED(item) Q_UNUSED(pixmapPath) diff --git a/src/libs/vmisc/def.h b/src/libs/vmisc/def.h index 45ba99a41..4c74c711b 100644 --- a/src/libs/vmisc/def.h +++ b/src/libs/vmisc/def.h @@ -413,6 +413,7 @@ extern const QString unitCM; extern const QString unitINCH; extern const QString unitPX; +QPixmap QPixmapFromCache(const QString &pixmapPath); void SetItemOverrideCursor(QGraphicsItem *item, const QString & pixmapPath, int hotX = -1, int hotY = -1); Q_REQUIRED_RESULT double ToPixel(double val, const Unit &unit); diff --git a/src/libs/vwidgets/vmaingraphicsview.cpp b/src/libs/vwidgets/vmaingraphicsview.cpp index f088af2bb..991c6f910 100644 --- a/src/libs/vwidgets/vmaingraphicsview.cpp +++ b/src/libs/vwidgets/vmaingraphicsview.cpp @@ -504,12 +504,17 @@ void VMainGraphicsView::mouseMoveEvent(QMouseEvent *event) { // Hack to fix problem with mouse cursor. Looks like after we switch cursor back it is rewrited back by a dialog. // Because no real way to catch this call we will check state for each move and compare to excpected state. - if (dragMode() != QGraphicsView::ScrollHandDrag && - // No way to restore bitmap from shape and we really don't need this for now. - m_currentCursor != Qt::BitmapCursor && - m_currentCursor != viewport()->cursor().shape()) + if (dragMode() != QGraphicsView::ScrollHandDrag) { - viewport()->setCursor(m_currentCursor); + QCursor cur = viewport()->cursor(); + // No way to restore bitmap from shape and we really don't need this for now. + if (m_currentCursor != Qt::BitmapCursor + && cur.shape() == Qt::BitmapCursor + && cur.pixmap().cacheKey() != QPixmapFromCache(cursorArrowOpenHand).cacheKey() + && cur.pixmap().cacheKey() != QPixmapFromCache(cursorArrowCloseHand).cacheKey()) + { + viewport()->setCursor(m_currentCursor); + } } if (dragMode() == QGraphicsView::ScrollHandDrag)