2010-11-23 96 views
7

我想使用自定義遊標和預設遊標的混合爲我的QGraphicsView。 在我的實現中,我們爲視圖創建了「模式」的概念。這意味着取決於用戶所處的「模式」,左鍵單擊或左鍵拖動會發生不同的事情。無論如何,這些都不是問題,只是背景。QGraphicsView和自定義遊標

當我嘗試更改每種模式的光標時,就會出現問題。例如,對於模式1,我們想要顯示常規的箭頭光標,但對於模式2,我們想要使用自定義的像素映射。看似簡單,當我們切換到模式1時,我們稱graphicsview->viewport()->setCursor(Qt::QArrowCursor),模式2時爲graphicsview->viewport()->setCursor(our custom cursor)。除非它完全不起作用。

首先,光標不會更改爲自定義光標。這是第一個問題。但是,如果通過其他操作將圖形視圖的拖動模式設置爲ScrollHandDrag,則在拖動操作完成後,光標將切換到自定義光標。奇怪的。但是情節變厚了......一旦我們切換到自定義光標,無論我們撥打setCursor(Qt::QArrowCursor)多少次,都不能將其更改回ArrorCursor。我是否在視口或圖形視圖本身上調用setCursor也沒有關係。

所以,只是爲了好玩,在我們想要改變光標之前,我加了一個graphicsview->unsetCursor()的調用,並且至少解決了第二個問題。只要我們在它們之間做一個小小的HandDragging,光標就可以改變。更好,但肯定不是最佳的。但是應該注意的是,在視口上執行unsetCursor不起作用。它必須絕對在圖形視圖上完成 - 無論我們是否將光標設置在視口上。

要完全修補了這個問題後,我將光標定我已經添加了這些兩行:

graphicsview->setDragMode(QGraphicsView::ScrollHandDrag); 
graphicsview->setDragMode(QGraphicsView::NoDrag); 

其中一期工程,但你們GADS!所以在這兩個方法裏發生了一些不可思議的事情,這些方法解決了這個問題,但是看了一下代碼,我看不出是什麼。與拖動模式正在改變我想象的光標有關。

爲了完整起見,我還應該提到觸發模式更改的事情,是使用QGraphicsScene->addWidget()添加到場景中的QPushButton。我不知道這與它有什麼關係,但你永遠不知道。

我希望有人可以澄清爲什麼我需要做出這些看似隨機的電話。我不認爲我在任何地方都做錯了什麼。預先感謝您的幫助。

編輯: 這是一個實際的代碼示例與遊標補丁如上所述。您可以從下面的鏈接查看和/或下載它們。粘貼在這裏有點長。我包括了遊標被改變的框架,因爲我有一個有趣的感覺,那就是很重要。

https://gist.github.com/712654

問題所在是在MyGraphicsView.cpp起始於線104在這裏將光標在圖形視圖中設置的代碼。完全如上所述。

請記住,隨着非常醜陋的補丁到位遊標確實工作 - 或多或少。如果沒有這些線路,您會非常清楚地看到上述文章中列出的問題。

也包含在鏈接中,是使用視圖的mainWindow的所有代碼等...唯一缺少的是我正在使用的圖像。但圖像本身並不重要,任何16x16 PNG都可以。

+2

使用graphicsview-> setCursor(...)和graphicsview-> viewport() - > setCursor(...)適用於我。你能提供一個最小的測試用例來展示你描述的異常行爲嗎? – 2010-11-23 16:13:10

回答

4

我添加了一個museReleaseEvent來解決類似的問題...

void mouseReleaseEvent(QMouseEvent *event) { 
    QGraphicsView::mouseReleaseEvent(event); 
    viewport()->setCursor(Qt::CrossCursor); 
} 

這將拖動事件後重置光標完成,拖手時將是可見的,這是有道理的。

4

我的解決辦法:

view->setDragMode(QGraphicsView::ScrollHandDrag); 
QApplication::setOverrideCursor(Qt::ArrowCursor);