在 QGraphicsView 中更改光标

Changing the cursor in a QGraphicsView

本文关键字:光标 QGraphicsView      更新时间:2023-10-16

我正在尝试在ScrollHandDrag打开时更改QGraphicsView的光标,但它似乎不起作用。如果我禁用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();

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)

参考文档:

Q应用程序::设置覆盖光标

Q应用程序::恢复覆盖光标

Q应用程序::更改覆盖光标