Изменение курсора в QGraphicsView

Я пытаюсь изменить курсор QGraphicsView в то время как ScrollHandDrag включен, но, похоже, не работает. Я могу изменить курсор, если отключить ScrollHandDrag но не в то время, когда он активен, я не понимаю, что я мог делать неправильно...

Ниже приведен фрагмент кода, который воспроизводит проблему:

QApplication app(argc, argv);
QGraphicsScene scene;
QRect rectangle(-8, -4, 100, 100);
QPen pen(Qt::blue, 1, Qt::SolidLine);
scene.addRect(rectangle, pen);
scene.setBackgroundBrush(Qt::white);
QGraphicsView vue(&scene);
vue.setFixedSize(250, 250);
//vue.setDragMode(QGraphicsView::ScrollHandDrag);
vue.setCursor(Qt::CrossCursor);
vue.show();

return app.exec();

2 ответа

Решение

QGraphicsView будет автоматически менять курсор при перетаскивании, но вы можете легко это исправить, переопределив несколько функций:

class CoolView : public QGraphicsView
{
protected:
    void enterEvent(QEvent *event)
    {
        QGraphicsView::enterEvent(event);
        viewport()->setCursor(Qt::CrossCursor);
    }

    void mousePressEvent(QMouseEvent *event)
    {
        QGraphicsView::mousePressEvent(event);
        viewport()->setCursor(Qt::CrossCursor);
    }

    void mouseReleaseEvent(QMouseEvent *event)
    {
        QGraphicsView::mouseReleaseEvent(event);
        viewport()->setCursor(Qt::CrossCursor);
    }
};

Из-за того, что ты копаешься в исходном коде Qt, похоже, что они получают контроль над этим курсором, когда ты входишь в режим перетаскивания, и нет способа остановить их попытки.

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

Также стоит отметить, что курсор установлен на уровне области просмотра, так что было бы немного более уместным сделать vue.viewport()->setCursor(Qt::CrossCursor)

Справочная документация:

QApplication:: setOverrideCursor

QApplication:: restoreOverrideCursor

QApplication:: changeOverrideCursor

Другие вопросы по тегам