Changing the cursor in a QGraphicsView

瘦欲@ 提交于 2019-12-08 16:41:28

问题


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();

回答1:


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);
    }
};



回答2:


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



来源:https://stackoverflow.com/questions/10952715/changing-the-cursor-in-a-qgraphicsview

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!