c++ - Qt QGraphicsView单元测试——如何让鼠标保持在 "pressed"状态?

标签 c++ qt4 pyqt 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 事件被 QGraphicsItem 视为 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 事件。

最佳答案

终于设法得到了实际有效的东西:

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 似乎会实际移动鼠标,因为此代码的作用就好像鼠标已经移动但没有移动一样。我知道很困惑!

关于c++ - Qt QGraphicsView单元测试——如何让鼠标保持在 "pressed"状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16299779/

相关文章:

c++ - 将 boost::thread 与 wxWidgets GUI 混合时出现 "Unhandled exception"错误

c++ - std::vector 和 std::array 初始化列表之间的区别

c++ - 使用 std::tie 比较结构

c++ - 从 Qt 字符串打开文件

c++ - 无法使用 std::for_each 在 QTextEdit 中构建完整的 html 表

c++ - 随机数字列表

python - 如何链接 PyQt4 脚本按钮以激活另一个脚本?

python - 使用 python 中的 PyQt5 按下按钮时更改 QML 中的标签

python - 如何为 PyQt 选择图形工具包

python - 通过 QT 设计者创建的 Qtoolbar 上的单击操作来调用函数