9

我正在尝试更改一段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();
4

2 回答 2

14

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);
    }
};
于 2012-06-08T17:54:10.133 回答
4

从 Qt 的源代码中查看,当您进入拖动模式时,它们似乎控制了该光标,并且无法阻止它们尝试。

我知道的唯一解决方法是使用QApplication::setOverrideCursor()并将QApplication::restoreOverrideCursor()全局设置光标。不幸的是,这意味着您必须在鼠标光标进入/离开时进行大量管理,QGraphicsView以防止您的整个应用程序在任何地方都被同一个光标卡住。

还值得注意的是光标是在视口级别设置的,所以这样做会稍微合适一些vue.viewport()->setCursor(Qt::CrossCursor)

参考文档:

QApplication::setOverrideCursor

QApplication::restoreOverrideCursor

QApplication::changeOverrideCursor

于 2012-06-08T16:45:43.397 回答