2012-06-08 143 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