2012-06-08 107 views
4

我试图在ScrollHandDrag打开时更改QGraphicsView的光标,但似乎不起作用。 我可以改变光标如果我禁用ScrollHandDrag但不能同时是活跃的,我看不出有什么我可能是做错了什么......在QGraphicsView中更改光标

贝娄是重现该问题的代码的一部分:

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

回答

7

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

有没有让光标变为默认值的函数?我尝试过这样的事情:'void MyQGraphicsView :: mouseReleaseEvent(QMouseEvent * event) {0} {QGraphicsView :: mouseReleaseEvent(event);如果(m_click) viewport() - > setCursor(Qt :: CrossCursor);如果(m_click) } else { viewport() - > unsetCursor(); } }'而不是有一个手形光标,这是我所期望的,我有箭头光标。我的问题是:我是否必须设置所有不同的游标,或者是否有一个函数可以撤销setCursor? – Leo

+1

@Leo您可以完全注释掉'enterEvent',然后更改'mouseReleaseEvent',使其具有'viewport() - > setCursor(Qt :: OpenHandCursor);'。 – Anthony

+0

不错的解决方法 – Chris

2

从Qt的源代码中可以看出,当你进入拖动模式并且没有办法阻止它们尝试时,它看起来像是控制了那个光标。

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

另外值得一提的是,光标被设置在视平,所以会稍微适当做vue.viewport()->setCursor(Qt::CrossCursor)

参考文档:

QApplication::setOverrideCursor

QApplication::restoreOverrideCursor

QApplication::changeOverrideCursor

+0

好的,谢谢您的回答。此外,如果你可以指示我如何管理这些游标或链接我值得阅读的东西,将不胜感激! – Leo