Module qimview.tests_utils.qtdump

Expand source code
from ..utils.qt_imports import QtGui, QtCore
from _md5 import md5
import numpy as np
import os

# Adapt to different versions
if "MouseButtonPress" in QtCore.QEvent.__dict__:
    qevent_types = QtCore.QEvent
else:
    qevent_types = QtCore.QEvent.Type

MOUSE_EVENTS = [
            # qevent_typese.KeyPress,
            qevent_types.MouseButtonPress,
            qevent_types.MouseButtonRelease,
            qevent_types.MouseMove,
            qevent_types.MouseButtonDblClick,
        ]

RESIZE_EVENTS = [ qevent_types.Resize ]

WHEEL_EVENT = [ qevent_types.Wheel]

class QtDump:

    # ----- Qt enum value -----
    @staticmethod
    def enum_value(v):
        return v.value

    # ----- Convert QMouseEvent -----
    @staticmethod
    def mouseevent2dict(evt):
        evt_type = evt.type()
        button = evt.button()
        buttons = evt.buttons()
        pos = evt.localPos()
        modifiers = evt.modifiers()
        # Transform each information
        info = {
            'type':     QtDump.enum_value(evt_type),
            'button':   QtDump.enum_value(button),
            'buttons':  QtDump.enum_value(buttons),
            'pos': [pos.x(), pos.y()],
            'modifiers': QtDump.enum_value(modifiers)
        }
        return info

    @staticmethod
    def dict2mouseevent(info):
        pos = QtCore.QPointF(info['pos'][0], info['pos'][1])
        mouse_event = QtGui.QMouseEvent(
            QtCore.QEvent.Type(info['type']),
            pos,
            QtCore.Qt.MouseButton(info['button']),
            QtCore.Qt.MouseButtons(info['buttons']),
            QtCore.Qt.KeyboardModifiers(info['modifiers']))
        return mouse_event

    # ----- Convert QSize -----
    @staticmethod
    def size2dict(size):
        width = size.width()
        height = size.height()
        # Transform each information
        info = {
            'width': width,
            'height': height,
        }
        return info

    @staticmethod
    def dict2size(info):
        return QtCore.QSize(info['width'], info['height'])

    # ----- Convert QPointF -----
    @staticmethod
    def qpointf2dict(pt):
        x = pt.x()
        y = pt.y()
        # Transform each information
        info = {
            'x': x,
            'y': y,
        }
        return info

    @staticmethod
    def dict2qpointf(info):
        return QtCore.QPointF(info['x'], info['y'])

    # ----- Convert QPoint -----
    @staticmethod
    def qpoint2dict(pt):
        x = pt.x()
        y = pt.y()
        # Transform each information
        info = {
            'x': x,
            'y': y,
        }
        return info

    @staticmethod
    def dict2qpoint(info):
        return QtCore.QPoint(info['x'], info['y'])

    # ----- Convert QWheelEvent -----
    @staticmethod
    def wheelevent2dict(evt):
        evt_type = evt.type()
        # Transform each information
        info = {
            'type':       evt_type.__int__(),
            'pos':        QtDump.qpointf2dict(evt.position()),
            'globalPos':  QtDump.qpointf2dict(evt.globalPosition()),
            'pixelDelta': QtDump.qpoint2dict (evt.pixelDelta()),
            'angleDelta': QtDump.qpoint2dict (evt.angleDelta()),
            'buttons':    QtDump.enum_value(evt.buttons()),
            'modifiers':  QtDump.enum_value(evt.modifiers()),
            'phase':      QtDump.enum_value(evt.phase()),
            'inverted':   evt.inverted(),
        }
        return info

    @staticmethod
    def dict2wheelevent(info):
        pos        = QtDump.dict2qpointf(         info['pos'])
        globalPos  = QtDump.dict2qpointf(         info['globalPos'])
        pixelDelta = QtDump.dict2qpoint(          info['pixelDelta'])
        angleDelta = QtDump.dict2qpoint(          info['angleDelta'])
        buttons    = QtCore.Qt.MouseButtons(      info['buttons'])
        modifiers  = QtCore.Qt.KeyboardModifiers( info['modifiers'])
        phase      = QtCore.Qt.ScrollPhase(       info['phase'])
        inverted   = info['inverted']
        event = QtGui.QWheelEvent(pos, globalPos, pixelDelta, angleDelta, buttons, modifiers, phase, inverted)
        return event

    # ----- Convert QResizeEvent -----
    @staticmethod
    def resizeevent2dict(evt):
        evt_type = evt.type()
        # Transform each information
        info = {
            'type': evt_type.__int__(),
            'size':    QtDump.size2dict(evt.size()),
            'oldSize': QtDump.size2dict(evt.oldSize()),
        }
        return info

    @staticmethod
    def dict2resizeevent(info):
        size = QtDump.dict2size(info['size'])
        oldSize = QtDump.dict2size(info['oldSize'])
        resize_event = QtGui.QResizeEvent(size, oldSize)
        return resize_event

    # ----- Convert dict to event -----
    @staticmethod
    def dict2event(info):
        if info['type'] in MOUSE_EVENTS:
            # print(f"mouse_event {info['type']}")
            return QtDump.dict2mouseevent(info)
        else:
            if info['type'] in RESIZE_EVENTS:
                return QtDump.dict2resizeevent(info)
            else:
                if info['type'] in WHEEL_EVENT:
                    return QtDump.dict2wheelevent(info)
                else:
                    print("Error: event not available")

    # ----- widget snapshot hash -----
    @staticmethod
    def get_screen_hash(widget):
        image = QtGui.QImage(widget.size(), QtGui.QImage.Format.Format_RGB32)
        widget.render(image)
        i = 0
        while os.path.isfile(f"_display_dump_{i}.png"):
            i += 1
        image.save(f"_display_dump_{i}.png")
        # get hash from image data pixmap.toImage().bits()
        image_bits = image.constBits()
        arr = np.array(image_bits).reshape(image.height(), image.width(), 4)
        image_hash = md5(arr).hexdigest()
        return image_hash

Classes

class QtDump
Expand source code
class QtDump:

    # ----- Qt enum value -----
    @staticmethod
    def enum_value(v):
        return v.value

    # ----- Convert QMouseEvent -----
    @staticmethod
    def mouseevent2dict(evt):
        evt_type = evt.type()
        button = evt.button()
        buttons = evt.buttons()
        pos = evt.localPos()
        modifiers = evt.modifiers()
        # Transform each information
        info = {
            'type':     QtDump.enum_value(evt_type),
            'button':   QtDump.enum_value(button),
            'buttons':  QtDump.enum_value(buttons),
            'pos': [pos.x(), pos.y()],
            'modifiers': QtDump.enum_value(modifiers)
        }
        return info

    @staticmethod
    def dict2mouseevent(info):
        pos = QtCore.QPointF(info['pos'][0], info['pos'][1])
        mouse_event = QtGui.QMouseEvent(
            QtCore.QEvent.Type(info['type']),
            pos,
            QtCore.Qt.MouseButton(info['button']),
            QtCore.Qt.MouseButtons(info['buttons']),
            QtCore.Qt.KeyboardModifiers(info['modifiers']))
        return mouse_event

    # ----- Convert QSize -----
    @staticmethod
    def size2dict(size):
        width = size.width()
        height = size.height()
        # Transform each information
        info = {
            'width': width,
            'height': height,
        }
        return info

    @staticmethod
    def dict2size(info):
        return QtCore.QSize(info['width'], info['height'])

    # ----- Convert QPointF -----
    @staticmethod
    def qpointf2dict(pt):
        x = pt.x()
        y = pt.y()
        # Transform each information
        info = {
            'x': x,
            'y': y,
        }
        return info

    @staticmethod
    def dict2qpointf(info):
        return QtCore.QPointF(info['x'], info['y'])

    # ----- Convert QPoint -----
    @staticmethod
    def qpoint2dict(pt):
        x = pt.x()
        y = pt.y()
        # Transform each information
        info = {
            'x': x,
            'y': y,
        }
        return info

    @staticmethod
    def dict2qpoint(info):
        return QtCore.QPoint(info['x'], info['y'])

    # ----- Convert QWheelEvent -----
    @staticmethod
    def wheelevent2dict(evt):
        evt_type = evt.type()
        # Transform each information
        info = {
            'type':       evt_type.__int__(),
            'pos':        QtDump.qpointf2dict(evt.position()),
            'globalPos':  QtDump.qpointf2dict(evt.globalPosition()),
            'pixelDelta': QtDump.qpoint2dict (evt.pixelDelta()),
            'angleDelta': QtDump.qpoint2dict (evt.angleDelta()),
            'buttons':    QtDump.enum_value(evt.buttons()),
            'modifiers':  QtDump.enum_value(evt.modifiers()),
            'phase':      QtDump.enum_value(evt.phase()),
            'inverted':   evt.inverted(),
        }
        return info

    @staticmethod
    def dict2wheelevent(info):
        pos        = QtDump.dict2qpointf(         info['pos'])
        globalPos  = QtDump.dict2qpointf(         info['globalPos'])
        pixelDelta = QtDump.dict2qpoint(          info['pixelDelta'])
        angleDelta = QtDump.dict2qpoint(          info['angleDelta'])
        buttons    = QtCore.Qt.MouseButtons(      info['buttons'])
        modifiers  = QtCore.Qt.KeyboardModifiers( info['modifiers'])
        phase      = QtCore.Qt.ScrollPhase(       info['phase'])
        inverted   = info['inverted']
        event = QtGui.QWheelEvent(pos, globalPos, pixelDelta, angleDelta, buttons, modifiers, phase, inverted)
        return event

    # ----- Convert QResizeEvent -----
    @staticmethod
    def resizeevent2dict(evt):
        evt_type = evt.type()
        # Transform each information
        info = {
            'type': evt_type.__int__(),
            'size':    QtDump.size2dict(evt.size()),
            'oldSize': QtDump.size2dict(evt.oldSize()),
        }
        return info

    @staticmethod
    def dict2resizeevent(info):
        size = QtDump.dict2size(info['size'])
        oldSize = QtDump.dict2size(info['oldSize'])
        resize_event = QtGui.QResizeEvent(size, oldSize)
        return resize_event

    # ----- Convert dict to event -----
    @staticmethod
    def dict2event(info):
        if info['type'] in MOUSE_EVENTS:
            # print(f"mouse_event {info['type']}")
            return QtDump.dict2mouseevent(info)
        else:
            if info['type'] in RESIZE_EVENTS:
                return QtDump.dict2resizeevent(info)
            else:
                if info['type'] in WHEEL_EVENT:
                    return QtDump.dict2wheelevent(info)
                else:
                    print("Error: event not available")

    # ----- widget snapshot hash -----
    @staticmethod
    def get_screen_hash(widget):
        image = QtGui.QImage(widget.size(), QtGui.QImage.Format.Format_RGB32)
        widget.render(image)
        i = 0
        while os.path.isfile(f"_display_dump_{i}.png"):
            i += 1
        image.save(f"_display_dump_{i}.png")
        # get hash from image data pixmap.toImage().bits()
        image_bits = image.constBits()
        arr = np.array(image_bits).reshape(image.height(), image.width(), 4)
        image_hash = md5(arr).hexdigest()
        return image_hash

Static methods

def dict2event(info)
Expand source code
@staticmethod
def dict2event(info):
    if info['type'] in MOUSE_EVENTS:
        # print(f"mouse_event {info['type']}")
        return QtDump.dict2mouseevent(info)
    else:
        if info['type'] in RESIZE_EVENTS:
            return QtDump.dict2resizeevent(info)
        else:
            if info['type'] in WHEEL_EVENT:
                return QtDump.dict2wheelevent(info)
            else:
                print("Error: event not available")
def dict2mouseevent(info)
Expand source code
@staticmethod
def dict2mouseevent(info):
    pos = QtCore.QPointF(info['pos'][0], info['pos'][1])
    mouse_event = QtGui.QMouseEvent(
        QtCore.QEvent.Type(info['type']),
        pos,
        QtCore.Qt.MouseButton(info['button']),
        QtCore.Qt.MouseButtons(info['buttons']),
        QtCore.Qt.KeyboardModifiers(info['modifiers']))
    return mouse_event
def dict2qpoint(info)
Expand source code
@staticmethod
def dict2qpoint(info):
    return QtCore.QPoint(info['x'], info['y'])
def dict2qpointf(info)
Expand source code
@staticmethod
def dict2qpointf(info):
    return QtCore.QPointF(info['x'], info['y'])
def dict2resizeevent(info)
Expand source code
@staticmethod
def dict2resizeevent(info):
    size = QtDump.dict2size(info['size'])
    oldSize = QtDump.dict2size(info['oldSize'])
    resize_event = QtGui.QResizeEvent(size, oldSize)
    return resize_event
def dict2size(info)
Expand source code
@staticmethod
def dict2size(info):
    return QtCore.QSize(info['width'], info['height'])
def dict2wheelevent(info)
Expand source code
@staticmethod
def dict2wheelevent(info):
    pos        = QtDump.dict2qpointf(         info['pos'])
    globalPos  = QtDump.dict2qpointf(         info['globalPos'])
    pixelDelta = QtDump.dict2qpoint(          info['pixelDelta'])
    angleDelta = QtDump.dict2qpoint(          info['angleDelta'])
    buttons    = QtCore.Qt.MouseButtons(      info['buttons'])
    modifiers  = QtCore.Qt.KeyboardModifiers( info['modifiers'])
    phase      = QtCore.Qt.ScrollPhase(       info['phase'])
    inverted   = info['inverted']
    event = QtGui.QWheelEvent(pos, globalPos, pixelDelta, angleDelta, buttons, modifiers, phase, inverted)
    return event
def enum_value(v)
Expand source code
@staticmethod
def enum_value(v):
    return v.value
def get_screen_hash(widget)
Expand source code
@staticmethod
def get_screen_hash(widget):
    image = QtGui.QImage(widget.size(), QtGui.QImage.Format.Format_RGB32)
    widget.render(image)
    i = 0
    while os.path.isfile(f"_display_dump_{i}.png"):
        i += 1
    image.save(f"_display_dump_{i}.png")
    # get hash from image data pixmap.toImage().bits()
    image_bits = image.constBits()
    arr = np.array(image_bits).reshape(image.height(), image.width(), 4)
    image_hash = md5(arr).hexdigest()
    return image_hash
def mouseevent2dict(evt)
Expand source code
@staticmethod
def mouseevent2dict(evt):
    evt_type = evt.type()
    button = evt.button()
    buttons = evt.buttons()
    pos = evt.localPos()
    modifiers = evt.modifiers()
    # Transform each information
    info = {
        'type':     QtDump.enum_value(evt_type),
        'button':   QtDump.enum_value(button),
        'buttons':  QtDump.enum_value(buttons),
        'pos': [pos.x(), pos.y()],
        'modifiers': QtDump.enum_value(modifiers)
    }
    return info
def qpoint2dict(pt)
Expand source code
@staticmethod
def qpoint2dict(pt):
    x = pt.x()
    y = pt.y()
    # Transform each information
    info = {
        'x': x,
        'y': y,
    }
    return info
def qpointf2dict(pt)
Expand source code
@staticmethod
def qpointf2dict(pt):
    x = pt.x()
    y = pt.y()
    # Transform each information
    info = {
        'x': x,
        'y': y,
    }
    return info
def resizeevent2dict(evt)
Expand source code
@staticmethod
def resizeevent2dict(evt):
    evt_type = evt.type()
    # Transform each information
    info = {
        'type': evt_type.__int__(),
        'size':    QtDump.size2dict(evt.size()),
        'oldSize': QtDump.size2dict(evt.oldSize()),
    }
    return info
def size2dict(size)
Expand source code
@staticmethod
def size2dict(size):
    width = size.width()
    height = size.height()
    # Transform each information
    info = {
        'width': width,
        'height': height,
    }
    return info
def wheelevent2dict(evt)
Expand source code
@staticmethod
def wheelevent2dict(evt):
    evt_type = evt.type()
    # Transform each information
    info = {
        'type':       evt_type.__int__(),
        'pos':        QtDump.qpointf2dict(evt.position()),
        'globalPos':  QtDump.qpointf2dict(evt.globalPosition()),
        'pixelDelta': QtDump.qpoint2dict (evt.pixelDelta()),
        'angleDelta': QtDump.qpoint2dict (evt.angleDelta()),
        'buttons':    QtDump.enum_value(evt.buttons()),
        'modifiers':  QtDump.enum_value(evt.modifiers()),
        'phase':      QtDump.enum_value(evt.phase()),
        'inverted':   evt.inverted(),
    }
    return info