gpt4 book ai didi

qt - 如何测试 PyQt 中的拖放行为?

转载 作者:行者123 更新时间:2023-11-28 19:44:59 25 4
gpt4 key购买 nike

我想对我们的小部件进行拖放单元测试。目前,我实例化了一个 QDragEnterEvent,但是由于 Qt 文档中的一个大警告,我不鼓励这样做,因为它依赖于 Qt 库的内部状态。事实上,我收到的段错误似乎是由于违反此警告造成的。

在这个前提下,如何测试拖放行为?

最佳答案

如果使用 Unix,我们可以使用 QTest,但是要获得跨平台解决方案,我们可以实现绕过 Qt 的解决方案。

使用QTest

尽管 drag and drop 的 Qt 文档说它不会阻塞主事件循环,仔细看看QDrag.exec将揭示这对 Windows 而言并非如此。

调用QTest.mousePress导致测试阻塞,直到鼠标被用户物理移动。

我在 Linux 中通过使用定时器来安排鼠标移动和释放来解决这个问题:

def testDragAndDrop(self):
QtCore.QTimer.singleShot(100, self.dropIt)
QtTest.QTest.mousePress(dragFromWidget, QtCore.Qt.LeftButton)

# check for desired behaviour after drop
assert something

def dropIt(self):
QtTest.QTest.mouseMove(dropToWidget)
QtTest.QTest.mouseRelease(dropToWidget, QtCore.Qt.LeftButton, delay=15)

对于此解决方案,有必要在 mouseRelease 调用中加入延迟,并在您的小部件上调用 show

请注意,我已经在 Fedora 20 上使用 pyqt4 和 Python 2.7 验证了这项工作

跨平台

您可以使用 PyUserInput 中的鼠标操作方法包裹。将鼠标交互放在单独的线程中以避免锁定 Qt 主事件循环。我们可以这样做,因为我们根本没有在我们的鼠标控件中使用 Qt。确保您已在拖入/拖出的小部件上调用了 show

from __future__ import division
import sys, time, threading
import numpy as np

from PyQt4 import QtGui, QtCore, QtTest
from pymouse import PyMouse
...

def mouseDrag(source, dest, rate=1000):
"""Simulate a mouse visible mouse drag from source to dest, rate is pixels/second"""
mouse = PyMouse()
mouse.press(*source)

# smooth move from source to dest
npoints = int(np.sqrt((dest[0]-source[0])**2 + (dest[1]-source[1])**2 ) / (rate/1000))
for i in range(npoints):
x = int(source[0] + ((dest[0]-source[0])/npoints)*i)
y = int(source[1] + ((dest[1]-source[1])/npoints)*i)
mouse.move(x,y)
time.sleep(0.001)

mouse.release(*dest)

def center(widget):
midpoint = QtCore.QPoint(widget.width()/2, widget.height()/2)
return widget.mapToGlobal(midpoint)

def testDragAndDrop(self):
# grab the center of the widgets
fromPos = center(dragFromWidget)
toPos = center(dropToWidget)

dragThread = threading.Thread(target=mouseDrag, args=((fromPos.x(),fromPos.y()), (toPos.x(), toPos.y())))
dragThread.start()
# cannot join, use non-blocking wait
while dragThread.is_alive():
QtTest.QTest.qWait(1000)

# check that the drop had the desired effect
assert dropToWidget.hasItemCount() > 0

请注意,我已经在 Fedora 和 Windows 7 上使用 PyQt4 和 Python 2.7 对此进行了测试

关于qt - 如何测试 PyQt 中的拖放行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24144482/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com