I'm trying to change the cursor of a QGraphicsView
while the ScrollHandDrag
is on, but it doesn't seem to work.
I can change the cursor if I disable the ScrollHandDrag
but not while it's active, I don't see what I could possibly be doing wrong...
Bellow is a portion of code that reproduce the problem:
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();
QGraphicsView
will automatically change the cursor while dragging, but you can easily fix this by reimplementing a few functions:
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);
}
};
From poking around in Qt's source code, it looks like they take control of that cursor when you enter drag mode and there's no way to stop them from trying.
The only workaround that I'm aware of is to use QApplication::setOverrideCursor()
and QApplication::restoreOverrideCursor()
which will set the cursor globally. Unfortunately this means you'd have to do a lot managing of when the mouse cursor enters/leaves your QGraphicsView
in order to prevent your whole application from getting stuck with the same cursor everywhere.
It's also worth noting that the cursor is set at the viewport level, so it would be slightly more appropriate to do vue.viewport()->setCursor(Qt::CrossCursor)
Reference documentation:
QApplication::setOverrideCursor
QApplication::restoreOverrideCursor
QApplication::changeOverrideCursor
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With