1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
|
import time
from pyqtgraph.Qt import QtCore, QtGui, QtTest, QtWidgets
def resizeWindow(win, w, h, timeout=2.0):
"""Resize a window and wait until it has the correct size.
This is required for unit testing on some platforms that do not guarantee
immediate response from the windowing system.
"""
QtWidgets.QApplication.processEvents()
# Sometimes the window size will switch multiple times before settling
# on its final size. Adding qWaitForWindowExposed seems to help with this.
QtTest.QTest.qWaitForWindowExposed(win)
win.resize(w, h)
start = time.time()
while True:
w1, h1 = win.width(), win.height()
if (w,h) == (w1,h1):
return
QtTest.QTest.qWait(10)
if time.time()-start > timeout:
raise TimeoutError("Window resize failed (requested %dx%d, got %dx%d)" % (w, h, w1, h1))
# Functions for generating user input events.
# We would like to use QTest for this purpose, but it seems to be broken.
# See: http://stackoverflow.com/questions/16299779/qt-qgraphicsview-unit-testing-how-to-keep-the-mouse-in-a-pressed-state
def mousePress(widget, pos: QtCore.QPointF, button, modifier=None):
if isinstance(widget, QtWidgets.QGraphicsView):
widget = widget.viewport()
global_pos = QtCore.QPointF(widget.mapToGlobal(pos.toPoint()))
if modifier is None:
modifier = QtCore.Qt.KeyboardModifier.NoModifier
event = QtGui.QMouseEvent(
QtCore.QEvent.Type.MouseButtonPress,
pos,
global_pos,
button,
QtCore.Qt.MouseButton.NoButton,
modifier
)
QtWidgets.QApplication.sendEvent(widget, event)
def mouseRelease(widget, pos: QtCore.QPointF, button, modifier=None):
if isinstance(widget, QtWidgets.QGraphicsView):
widget = widget.viewport()
global_pos = QtCore.QPointF(widget.mapToGlobal(pos.toPoint()))
if modifier is None:
modifier = QtCore.Qt.KeyboardModifier.NoModifier
event = QtGui.QMouseEvent(
QtCore.QEvent.Type.MouseButtonRelease,
pos,
global_pos,
button,
QtCore.Qt.MouseButton.NoButton,
modifier
)
QtWidgets.QApplication.sendEvent(widget, event)
def mouseMove(widget, pos: QtCore.QPointF, buttons=None, modifier=None):
if isinstance(widget, QtWidgets.QGraphicsView):
widget = widget.viewport()
global_pos = QtCore.QPointF(widget.mapToGlobal(pos.toPoint()))
if modifier is None:
modifier = QtCore.Qt.KeyboardModifier.NoModifier
if buttons is None:
buttons = QtCore.Qt.MouseButton.NoButton
event = QtGui.QMouseEvent(
QtCore.QEvent.Type.MouseMove,
pos,
global_pos,
QtCore.Qt.MouseButton.NoButton,
buttons,
modifier
)
QtWidgets.QApplication.sendEvent(widget, event)
def mouseDrag(widget, pos1: QtCore.QPointF, pos2: QtCore.QPointF, button, modifier=None):
mouseMove(widget, pos1)
mousePress(widget, pos1, button, modifier)
mouseMove(widget, pos2, button, modifier)
mouseRelease(widget, pos2, button, modifier)
def mouseClick(widget, pos: QtCore.QPointF, button, modifier=None):
mouseMove(widget, pos)
mousePress(widget, pos, button, modifier)
mouseRelease(widget, pos, button, modifier)
|