2013-04-30 42 views
5

我擁有相當複雜的QGraphicsView /場景設置在那裏的我有複雜的相互作用項目。的Qt的QGraphicsView單元測試 - 如何讓鼠標在「按下」狀態?

因此我想單元測試是爲了避免在已經存在的功能產生錯誤。對於一個測試,我想:

  1. 按下鼠標按下場景中的一個項目
  2. 將鼠標移動到右側
  3. 鬆開鼠標

這將讓我檢查該項目被選擇,通過正確的量移動,並且被取消選擇。

不過,我發現,發送的mouseMove事件的鼠標狀態之後變爲「釋放」,這裏是我的代碼:

QTest.mousePress(gv.viewport(), Qt.LeftButton, Qt.NoModifier, QPoint(80,80), 100) 
QTest.mouseMove(gv.viewport(), QPoint(80,80), 200) 
QTest.mouseMove(gv.viewport(), QPoint(90,80), 300) 
QTest.mouseMove(gv.viewport(), QPoint(100,80), 400) 
QTest.mouseRelease(gv.viewport(), Qt.LeftButton, Qt.NoModifier, QPoint(80,80), 900) 

其中GV是一個的QGraphicsView。

這個問題似乎是鼠標移動事件被看作是對的QGraphicsItem hoverMoveEvents - 它應該被視爲一個mouseMoveEvent!

根據文檔:

http://qt-project.org/doc/qt-4.8/qgraphicsitem.html#setAcceptHoverEvents

所以它似乎是這些模擬事件沒有設置「鼠標抓取項目」?

相關:

How to unit test qt graphics view widgets/items

編輯:

TLDR;爲什麼我的假鼠標事件沒有設置當前的鼠標抓取器項目?這將導致QGraphicsItems得到mouseHover事件,而不是mousemove事件時。

+0

http://qt.gitorious.org/qt/qt/blobs/51be60532af93ac6526e76db4085283465c5baa6/tests/auto/qgraphicsview/tst_qgraphicsview.cpp可能會yeild我的答案..進一步調查要求 – paulm 2013-05-01 21:16:15

回答

6

終於設法得到的東西,實際工作:

w = gv.viewport() 

# this actually gets the click to the view 
#QTest.mouseMove(w, QPoint(80,80)) 
event = QMouseEvent(QEvent.MouseMove, QPoint(80,80), w.mapToGlobal(QPoint(80,80)), Qt.LeftButton, Qt.LeftButton, Qt.NoModifier); 
#event.setSpontaneous(True) 
QApplication.postEvent(w, event); 
QTest.qWait(250) 

#QTest.mouseMove(w, QPoint(80,80)) 
event = QMouseEvent(QEvent.MouseButtonPress, QPoint(80,80), w.mapToGlobal(QPoint(80,80)), Qt.LeftButton, Qt.LeftButton, Qt.NoModifier); 
QApplication.postEvent(w, event); 
QTest.qWait(250) 

count = 0 
while count < 20: 

    #QTest.mouseMove(w, QPoint(80+count,80+count)) 
    event = QMouseEvent(QEvent.MouseMove, QPoint(80+count,80+count), w.mapToGlobal(QPoint(80+count,80+count)), Qt.LeftButton, Qt.LeftButton, Qt.NoModifier); 
    QApplication.postEvent(w, event); 
    t = w.mapToGlobal(QPoint(80+count,80+count)) 
    #QCursor.setPos(t) 
    QTest.qWait(20) 
    count = count + 1 

event = QMouseEvent(QEvent.MouseButtonRelease, QPoint(100,100), w.mapToGlobal(QPoint(100,100)), Qt.LeftButton, Qt.LeftButton, Qt.NoModifier); 
QApplication.postEvent(w, event); 

爲什麼這些製造活動的工作和QTEST那些沒有我不知道..

看來,QTEST將身體移動鼠標,這裏的代碼就像鼠標移動但沒有移動一樣。混淆我知道!

+2

我很高興我遇到了這個。我幾天來一直在打我的頭......關鍵是'widget = QtGui.QGraphicsView.viewport()',然後將'widget'傳遞給'QTest.mouseClick(widget)'。我沒有嘗試'mouseMove'。 – Onlyjus 2015-11-20 17:33:50