Qt QGraphicsView单元测试 - 如何让鼠标保持“按下”状态?

时间:2013-04-30 12:20:19

标签: c++ qt4 pyqt qgraphicsview

我有一个相当复杂的QGraphicsView / Scene设置,其中包含复杂交互的项目。

因此我想对此进行单元测试,以避免在现有功能中产生错误。我想做一个测试:

  1. 在场景中的项目上按下鼠标
  2. 将鼠标移到右侧
  3. 释放鼠标
  4. 这将允许我检查项目是否已被选中,被移动了正确的数量,并被取消选择。

    但是我发现发送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将mouseMove事件视为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事件。

1 个答案:

答案 0 :(得分: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将物理移动鼠标,因为此代码就像鼠标移动但没有移动一样。让我感到困惑!