Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Changing the cursor in a QGraphicsView

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();
like image 894
Leo Avatar asked Jun 08 '12 16:06

Leo


2 Answers

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);
    }
};
like image 53
Anthony Avatar answered Oct 20 '22 12:10

Anthony


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

like image 28
Chris Avatar answered Oct 20 '22 13:10

Chris