C++ Qt QGraphicsView单元测试-如何将鼠标保持在;按「;国家?

C++ Qt QGraphicsView单元测试-如何将鼠标保持在;按「;国家?,c++,qt4,pyqt,qgraphicsview,C++,Qt4,Pyqt,Qgraphicsview,我有一个相当复杂的QGraphicsView/场景设置,在这里我有一些具有复杂交互的项目 因此,我希望对此进行单元测试,以避免在现有功能中创建bug。就其中一项测试而言,我希望: 在场景中的项目上按下鼠标 向右移动鼠标 放开鼠标 这将允许我检查项目是否被选中、移动了正确的数量以及是否被取消选中 但是我发现在发送mouseMove事件后,鼠标状态变为“released”,下面是我的代码: QTest.mousePress(gv.viewport(), Qt.LeftButton, Qt.NoMod

我有一个相当复杂的QGraphicsView/场景设置,在这里我有一些具有复杂交互的项目

因此,我希望对此进行单元测试,以避免在现有功能中创建bug。就其中一项测试而言,我希望:

  • 在场景中的项目上按下鼠标
  • 向右移动鼠标
  • 放开鼠标
  • 这将允许我检查项目是否被选中、移动了正确的数量以及是否被取消选中

    但是我发现在发送mouseMove事件后,鼠标状态变为“released”,下面是我的代码:

    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