Сброс курсора мыши Qt - PullRequest
       16

Сброс курсора мыши Qt

3 голосов
/ 26 марта 2012

У меня есть элемент делегата, что когда событие мыши заканчивается над значком, я изменяю его Курсор на Qt :: PointingHandCursor, когда он выключен, я возвращаю его обратно в Qt :: ArrowCursor.он работает нормально.
проблема в том, что, кроме того, когда он над значком.он всегда складывается в Qt :: ArrowCursor даже в ситуации, когда значок должен быть изменен изначально, например, при изменении размера окна или при нажатии на встроенную кнопку.это всегда Qt :: ArrowCursor.
как я могу заставить Курсор действовать нормально, когда его нет над значком?
вот что я делаю:

bool MiniItemDelegate::editorEvent(QEvent *event, QAbstractItemModel *model,
                                         const QStyleOptionViewItem &option,
                                         const QModelIndex &index)
    {
        // Emit a signal when the icon is clicked
        QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event);
        if(!index.parent().isValid() &&
                event->type() == QEvent::MouseMove) 
        {

             QSize  iconsize = m_iconAdd.actualSize(option.decorationSize); 
             QRect closeButtonRect =  m_iconAdd.pixmap(iconsize.width(),iconsize.height()).
                                                        rect().translated(AddIconPos(option));

             QSize iconRemoveSize = m_iconRemove.actualSize(option.decorationSize);
             QRect iconRemoveRect =  m_iconRemove.pixmap(iconRemoveSize.width(),iconRemoveSize.height()).
                                                                rect().translated(RemoveIconPos(option));

             if(closeButtonRect.contains(mouseEvent->pos()))
             {                
                QApplication::setOverrideCursor(QCursor(Qt::PointingHandCursor)); 
             }
             else if(iconRemoveRect.contains(mouseEvent->pos()))
             {
                QApplication::setOverrideCursor(QCursor(Qt::PointingHandCursor)); 
             }
             else
             {
                 Qt::CursorShape shape = Qt::ArrowCursor;
                 QApplication::setOverrideCursor(QCursor(shape)); 
             }
        }

        if(!index.parent().isValid() &&
                event->type() == QEvent::MouseButtonRelease) 
        {


             QSize  iconsize = m_iconAdd.actualSize(option.decorationSize); 
             QRect closeButtonRect =  m_iconAdd.pixmap(iconsize.width(),iconsize.height()).
                                                        rect().translated(AddIconPos(option));

             QSize iconRemoveSize = m_iconRemove.actualSize(option.decorationSize);
             QRect iconRemoveRect =  m_iconRemove.pixmap(iconRemoveSize.width(),iconRemoveSize.height()).
                                                                rect().translated(RemoveIconPos(option));

             if(closeButtonRect.contains(mouseEvent->pos()))
             {
               ; 
             }
             else if(iconRemoveRect.contains(mouseEvent->pos()))
             {
                ; 
             }
        }

        return false;
    }

1 Ответ

6 голосов
/ 26 марта 2012

Вам нужно использовать restoreOverrideCursor(), чтобы отменить каждый вызов setOverrideCursor(). Из документации:

http://doc.qt.io/archives/qt-4.7/qapplication.html#setOverrideCursor

Курсоры приложений хранятся во внутреннем стеке. setOverrideCursor () помещает курсор в стек и restoreOverrideCursor () выталкивает активный курсор из стека. changeOverrideCursor () изменяет текущее активное приложение переопределить курсор. Каждый setOverrideCursor () должен в конечном итоге следовать с помощью соответствующего restoreOverrideCursor (), в противном случае стек будет никогда не опустошай.

Вы должны будете точно выяснить, как заставить это работать в вашем коде (не совсем понятно, какое поведение вы хотите), но вы могли бы начать с замены этого else предложения

{
  Qt::CursorShape shape = Qt::ArrowCursor;
  QApplication::setOverrideCursor(QCursor(shape));
}

с

{
  QApplication::restoreOverrideCursor();
}

ПРИМЕЧАНИЕ. В моих приложениях я создал класс в стиле RAII, который инициализируется с помощью Qt::CursorShape, вызывает setOverrideCursor(...) в его конструкторе и вызывает restoreOverrideCursor() в его деструкторе. Таким образом, вы можете установить форму курсора внутри функции и быть уверенным, что это изменение не будет выполнено автоматически к моменту окончания функции. Это может работать не во всех случаях, но когда это работает, это облегчает задачу.

...