У меня довольно сложная настройка QGraphicsView / Scene, где у меня есть элементы со сложным взаимодействием.
Поэтому я хочу провести модульное тестирование, чтобы избежать ошибок в уже существующих функциях. Для одного теста я хочу:
Это позволит мне проверить, что элемент был выбран, перемещен на правильную сумму и был отменен.
Однако я обнаружил, что после отправки событий 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.
Кажется, проблема в том, что события mouseMove рассматриваются как hoverMoveEvents объектом QGraphicsItem — его следует рассматривать как mouseMoveEvent!
Согласно документам:
http://qt-project.org/doc/qt-4.8/qgraphicsitem.html#setAcceptHoverEvents
Так что может показаться, что эти смоделированные события не устанавливают «элемент захвата мыши»?
Связанные с:
Как выполнить модульное тестирование виджетов / элементов вида qt graphics
Редактировать:
TLDR; Почему мои события с поддельной мышью не устанавливают текущий элемент захвата мыши? Это заставляет QGraphicsItems получать события mouseHover вместо событий mouseMove.
Наконец-то удалось получить то, что действительно работает:
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 будет физически двигать мышь, тогда как этот код действует так, как если бы мышь двигалась, но не двигалась. Смущаюсь я знаю!
Других решений пока нет …