Изменение курсора в 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