Qt QGraphicsView 单元测试 - 如何保持鼠标处于"pressed"状态?
Qt QGraphicsView unit testing - how to keep the mouse in a "pressed" state?
我有一个相当复杂的QGraphicsView/Scene设置,其中我有复杂的交互项目。
因此,我想对它进行单元测试,以避免在已经存在的功能中产生错误。对于一个测试,我希望:- 在场景中的一个项目上按下鼠标
- 将鼠标向右移动
- 释放鼠标
这将允许我检查项目是否被选中,移动了正确的量,以及是否被取消选中。
然而,我发现发送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
问题似乎是,鼠标移动事件被视为hoverMoveEvents的QGraphicsItem -它应该被视为一个鼠标移动事件!
根据文档:
http://qt project.org/doc/qt - 4.8 -/- qgraphicsitem.html # setAcceptHoverEvents
所以这些模拟事件似乎没有设置"鼠标抓取项"?
相关:如何对qt图形视图部件/项进行单元测试
编辑: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将物理地移动鼠标,而这段代码就好像鼠标移动了,但没有移动。我知道很困惑!
相关文章:
- Constexpr替代了新的放置方式,可以让内存中的对象保持未初始化状态
- 我不断收到 [错误] ID 返回 1 退出状态错误,但看不到问题所在
- OSX MetalKit CVMetalTextureCacheCreateTextureFromImage失败,状态:
- std::future_error:无关联状态
- 如何避免LED在循环状态变化中闪烁?
- boost 是否有按特殊类型值编码状态"compact optional"?
- 为什么系统函数总是在C++中返回已转移的退出状态?
- C++ 中的编译错误:未定义对"主"的引用 collect2:错误:ld 返回 1 个退出状态
- 当可输入框在窗口中处于活动状态时获得通知的任何方法
- 检查两个节点在子节点上是否具有相同状态的更优雅的方法
- 将有状态的 lambda 传递到 C 样式函数中,而无需上下文参数
- 在 nullptr 上调用无状态类的非静态成员函数是否合法?
- 编译问题:在函数"_start"中:未定义对"主"的引用 collect2:错误:ld 返回 1 个退出状态
- C++部分概念 id:显式模板规范顺序/第一个参数的特殊状态的原因是什么?
- 试图在崇高中奔跑. 错误 已发生: 收集2.exe: 错误: ld 返回 1 退出状态
- 在容器上移动分配:以前包含的对象的状态
- collect2:错误:ld 返回 1 个退出状态未定义的引用
- 具有动态大小的特征矩阵的默认初始状态
- 如何从Clojure调用C++程序,以使程序保持打开状态?
- Qt QGraphicsView 单元测试 - 如何保持鼠标处于"pressed"状态?