C++ Qt QGraphicsView单元测试-如何将鼠标保持在;按「;国家?
我有一个相当复杂的QGraphicsView/场景设置,在这里我有一些具有复杂交互的项目 因此,我希望对此进行单元测试,以避免在现有功能中创建bug。就其中一项测试而言,我希望:C++ Qt QGraphicsView单元测试-如何将鼠标保持在;按「;国家?,c++,qt4,pyqt,qgraphicsview,C++,Qt4,Pyqt,Qgraphicsview,我有一个相当复杂的QGraphicsView/场景设置,在这里我有一些具有复杂交互的项目 因此,我希望对此进行单元测试,以避免在现有功能中创建bug。就其中一项测试而言,我希望: 在场景中的项目上按下鼠标 向右移动鼠标 放开鼠标 这将允许我检查项目是否被选中、移动了正确的数量以及是否被取消选中 但是我发现在发送mouseMove事件后,鼠标状态变为“released”,下面是我的代码: QTest.mousePress(gv.viewport(), Qt.LeftButton, Qt.NoMod
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
根据文件:
因此,这些模拟事件似乎没有设置“鼠标抓取项”
相关的:
编辑:
TLDR;为什么我的假鼠标事件没有设置当前的鼠标抓取器项目?这会导致QGraphicsSitems获得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);
w=gv.viewport()
#这实际上可以点击视图
#数量测试鼠标移动(w,QPoint(80,80))
event=QMouseEvent(QEvent.MouseMove,QPoint(80,80),w.mapToGlobal(QPoint(80,80)),Qt.LeftButton,Qt.LeftButton,Qt.NoModifier);
#事件。setSpontaneous(真)
QApplication.postEvent(w,事件);
QTest.qWait(250)
#数量测试鼠标移动(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,事件);
QTest.qWait(250)
计数=0
当计数小于20时:
#QTest.mouseMove(w,QPoint(80+计数,80+计数))
event=QMouseEvent(QEvent.MouseMove,QPoint(80+计数,80+计数),w.mapToGlobal(QPoint(80+计数,80+计数)),Qt.LeftButton,Qt.LeftButton,Qt.NoModifier);
QApplication.postEvent(w,事件);
t=w.mapToGlobal(QPoint(80+计数,80+计数))
#QCursor.setPos(t)
QTest.qWait(20)
计数=计数+1
event=QMouseEvent(QEvent.MouseButtonRelease,QPoint(100100),w.mapToGlobal(QPoint(100100)),Qt.LeftButton,Qt.LeftButton,Qt.NoModifier);
QApplication.postEvent(w,事件);
我不知道为什么这些捏造的事件有效,而最重要的事件无效
QTest似乎将实际移动鼠标,而这段代码的作用就好像鼠标已经移动但没有移动一样。我知道 也许你会接受我的回答。。需要进一步调查我很高兴我发现了这一点。我已经打了好几天了。。。关键是
widget=QtGui.QGraphicsView.viewport()
,然后将widget
传递给QTest.mouseClick(widget)
。我还没有试过mouseMove
。