Qt QGraphicsView модульное тестирование — как удерживать мышь в «нажатом» состоянии; государство?

У меня довольно сложная настройка QGraphicsView / Scene, где у меня есть элементы со сложным взаимодействием.

Поэтому я хочу провести модульное тестирование, чтобы избежать ошибок в уже существующих функциях. Для одного теста я хочу:

  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.

Кажется, проблема в том, что события mouseMove рассматриваются как hoverMoveEvents объектом QGraphicsItem — его следует рассматривать как mouseMoveEvent!

Согласно документам:

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

Так что может показаться, что эти смоделированные события не устанавливают «элемент захвата мыши»?

Связанные с:

Как выполнить модульное тестирование виджетов / элементов вида qt graphics

Редактировать:

TLDR; Почему мои события с поддельной мышью не устанавливают текущий элемент захвата мыши? Это заставляет QGraphicsItems получать события mouseHover вместо событий mouseMove.

5

Решение

Наконец-то удалось получить то, что действительно работает:

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 будет физически двигать мышь, тогда как этот код действует так, как если бы мышь двигалась, но не двигалась. Смущаюсь я знаю!

6

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]