From c623340ce609dee22a75cb474d565903875947bd Mon Sep 17 00:00:00 2001 From: rekonder Date: Mon, 14 Mar 2016 16:37:49 +0100 Subject: [PATCH 1/4] Added events and constructors for events --- pyqttester.py | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/pyqttester.py b/pyqttester.py index 2fe9b60..97a6764 100755 --- a/pyqttester.py +++ b/pyqttester.py @@ -184,7 +184,7 @@ def parse_args(): parser_record.add_argument( '--events-include', metavar='REGEX', - default=r'MouseEvent,KeyEvent,CloseEvent', # TODO: add Drag, Focus, Hover ? + default=r'MouseEvent,KeyEvent,CloseEvent,FocusEvent,DragLeaveEvent,DragEnterEvent,HoverEvent,ChildEvent', # TODO: add Drag, Focus, Hover ? help='When recording, record only events that match the filter.') parser_record.add_argument( '--events-exclude', metavar='REGEX', @@ -499,6 +499,11 @@ def _serialize_value(cls, value, attr): 'QKeyEvent': 'type key modifiers text isAutoRepeat count'.split(), 'QMoveEvent': 'pos oldPos'.split(), 'QCloseEvent': [], + 'QChildEvent' : 'type child'.split(), + 'QFocusEvent' : 'type reason'.split(), + 'QDragLeaveEvent' : [], + 'QDragEnterEvent' : 'point actions data buttons modifiers'.split(), + 'QHoverEvent' : 'type pos oldPos'.split(), #for qt4 } @classmethod @@ -581,7 +586,7 @@ def serialize_object(cls, obj): path = [] parent = obj - while parent: + while parent is not None: widget, parent = parent, parent.parentWidget() children = cls._get_children(parent) # This typed index is more resilient than simple layout.indexOf() @@ -730,6 +735,8 @@ class EventRecorder(_EventFilter): def __init__(self, file, events_include, events_exclude): super().__init__() self.file = file + self.skipped = [] + self.stevec = 0 # Prepare the recorded events stack; # the first entry is the protocol version @@ -754,8 +761,12 @@ def eventFilter(self, obj, event): # Only process out-of-application, system (e.g. X11) events # if not event.spontaneous(): # return False + is_skipped = (not self.event_matches(type(event).__name__) or not isinstance(obj, QWidget)) # FIXME: This condition is too strict (QGraphicsItems are QOjects) + + if not isinstance(obj, QWidget): + self.stevec +=1 log_ = log.debug if is_skipped else log.info log.info('Caught %s%s %s event (%s) on object %s', 'skipped' if is_skipped else 'recorded', @@ -763,6 +774,12 @@ def eventFilter(self, obj, event): EVENT_TYPE.get(event.type(), 'Unknown(type=' + str(event.type()) + ')'), event.__class__.__name__, obj) + if EVENT_TYPE.get(event.type()) == 'ChildAdded': + pass + if is_skipped: + self.skipped.append(EVENT_TYPE.get(event.type(), + 'Unknown(type=' + str(event.type()) + ')')) + # Before any event on any widget, make sure the window of that window # is active and raised (in front). This is required for replaying # without a window manager. @@ -785,7 +802,9 @@ def close(self): log.info("Scenario of %d events written into '%s'", len(self.events) - SCENARIO_FORMAT_VERSION - 1, self.file.name) log.debug(self.events) - + for i in set(self.skipped): + log.info(i) + log.info(self.stevec) class EventReplayer(_EventFilter): def __init__(self, file): From faf9b482e70ffd1fd499abe23991aac66a2208b4 Mon Sep 17 00:00:00 2001 From: rekonder Date: Mon, 14 Mar 2016 18:55:17 +0100 Subject: [PATCH 2/4] Adding new events --- pyqttester.py | 27 ++++++++++++++------------- setup.py | 0 2 files changed, 14 insertions(+), 13 deletions(-) mode change 100644 => 100755 setup.py diff --git a/pyqttester.py b/pyqttester.py index 97a6764..06aac02 100755 --- a/pyqttester.py +++ b/pyqttester.py @@ -184,7 +184,9 @@ def parse_args(): parser_record.add_argument( '--events-include', metavar='REGEX', - default=r'MouseEvent,KeyEvent,CloseEvent,FocusEvent,DragLeaveEvent,DragEnterEvent,HoverEvent,ChildEvent', # TODO: add Drag, Focus, Hover ? + default='MouseEvent,KeyEvent,CloseEvent,FocusEvent,DragLeaveEvent,DragEnterEvent,HoverEvent,HideEvent,' + 'ShowEvent,StatusTipEvent,ResizeEvent,SocketNotifier', # TODO: add Drag, Focus, Hover ? + #ChildEvent do not work' help='When recording, record only events that match the filter.') parser_record.add_argument( '--events-exclude', metavar='REGEX', @@ -476,6 +478,10 @@ def _serialize_value(cls, value, attr): value.y(), value.width(), value.height()) + if isinstance(value, (QtCore.QSize, QtCore.QSizeF)): + return 'QtCore.{}({}, {})'.format(type(value).__name__, + value.width(), + value.height()) # Perhaps it's an enum value from Qt namespace assert isinstance(Qt.LeftButton, int) if isinstance(value, int): @@ -504,6 +510,13 @@ def _serialize_value(cls, value, attr): 'QDragLeaveEvent' : [], 'QDragEnterEvent' : 'point actions data buttons modifiers'.split(), 'QHoverEvent' : 'type pos oldPos'.split(), #for qt4 + 'QPaintEvent' : 'paintRegion'.split(), + 'QHideEvent' : [], + 'QShowEvent' : [], + 'QStatusTipEvent' : 'tip'.split(), + 'QResizeEvent' : 'size oldSize'.split(), + 'QActionEvent' : 'type action before'.split(), + 'QSocketNotifier' : 'socket type parent'.split(), } @classmethod @@ -735,8 +748,6 @@ class EventRecorder(_EventFilter): def __init__(self, file, events_include, events_exclude): super().__init__() self.file = file - self.skipped = [] - self.stevec = 0 # Prepare the recorded events stack; # the first entry is the protocol version @@ -765,8 +776,6 @@ def eventFilter(self, obj, event): is_skipped = (not self.event_matches(type(event).__name__) or not isinstance(obj, QWidget)) # FIXME: This condition is too strict (QGraphicsItems are QOjects) - if not isinstance(obj, QWidget): - self.stevec +=1 log_ = log.debug if is_skipped else log.info log.info('Caught %s%s %s event (%s) on object %s', 'skipped' if is_skipped else 'recorded', @@ -774,11 +783,6 @@ def eventFilter(self, obj, event): EVENT_TYPE.get(event.type(), 'Unknown(type=' + str(event.type()) + ')'), event.__class__.__name__, obj) - if EVENT_TYPE.get(event.type()) == 'ChildAdded': - pass - if is_skipped: - self.skipped.append(EVENT_TYPE.get(event.type(), - 'Unknown(type=' + str(event.type()) + ')')) # Before any event on any widget, make sure the window of that window # is active and raised (in front). This is required for replaying @@ -802,9 +806,6 @@ def close(self): log.info("Scenario of %d events written into '%s'", len(self.events) - SCENARIO_FORMAT_VERSION - 1, self.file.name) log.debug(self.events) - for i in set(self.skipped): - log.info(i) - log.info(self.stevec) class EventReplayer(_EventFilter): def __init__(self, file): diff --git a/setup.py b/setup.py old mode 100644 new mode 100755 From 949cc9cdc78d6ce30e63d653a724fd1160ff00f9 Mon Sep 17 00:00:00 2001 From: rekonder Date: Mon, 14 Mar 2016 18:58:33 +0100 Subject: [PATCH 3/4] Small correction --- pyqttester.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyqttester.py b/pyqttester.py index 06aac02..5823d6f 100755 --- a/pyqttester.py +++ b/pyqttester.py @@ -184,7 +184,7 @@ def parse_args(): parser_record.add_argument( '--events-include', metavar='REGEX', - default='MouseEvent,KeyEvent,CloseEvent,FocusEvent,DragLeaveEvent,DragEnterEvent,HoverEvent,HideEvent,' + default=r'MouseEvent,KeyEvent,CloseEvent,FocusEvent,DragLeaveEvent,DragEnterEvent,HoverEvent,HideEvent,' 'ShowEvent,StatusTipEvent,ResizeEvent,SocketNotifier', # TODO: add Drag, Focus, Hover ? #ChildEvent do not work' help='When recording, record only events that match the filter.') From 0caead3838f50a9491289752c1f6d9394da6dad4 Mon Sep 17 00:00:00 2001 From: rekonder Date: Mon, 21 Mar 2016 15:24:39 +0100 Subject: [PATCH 4/4] modified --- pyqttester.py | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/pyqttester.py b/pyqttester.py index 5823d6f..d6ad9b2 100755 --- a/pyqttester.py +++ b/pyqttester.py @@ -185,7 +185,7 @@ def parse_args(): parser_record.add_argument( '--events-include', metavar='REGEX', default=r'MouseEvent,KeyEvent,CloseEvent,FocusEvent,DragLeaveEvent,DragEnterEvent,HoverEvent,HideEvent,' - 'ShowEvent,StatusTipEvent,ResizeEvent,SocketNotifier', # TODO: add Drag, Focus, Hover ? + 'ShowEvent,StatusTipEvent,ResizeEvent,SocketNotifier,StatusTipEvent', # TODO: add Drag, Focus, Hover ? #ChildEvent do not work' help='When recording, record only events that match the filter.') parser_record.add_argument( @@ -480,9 +480,13 @@ def _serialize_value(cls, value, attr): value.height()) if isinstance(value, (QtCore.QSize, QtCore.QSizeF)): return 'QtCore.{}({}, {})'.format(type(value).__name__, - value.width(), - value.height()) - # Perhaps it's an enum value from Qt namespace + value.width(), + value.height()) + #if isinstance(value, (QtGui.QActionEvent)): + # return 'QtGui.{}({}, {}, {})'.format(type(value).__name__,value.parent(), value.type(), value.action(), value.before()) + + #if isinstance(value, (QtCore.QString)): + # return '{}()'.format(type(value).__name__) assert isinstance(Qt.LeftButton, int) if isinstance(value, int): s = cls._qenum_key(Qt, value) @@ -515,8 +519,9 @@ def _serialize_value(cls, value, attr): 'QShowEvent' : [], 'QStatusTipEvent' : 'tip'.split(), 'QResizeEvent' : 'size oldSize'.split(), + 'QSocketNotifier' : 'socket type parent'.split(), #problem with QObject* parent 'QActionEvent' : 'type action before'.split(), - 'QSocketNotifier' : 'socket type parent'.split(), + 'QStatusTipEvent' : 'tip'.split(), } @classmethod @@ -748,6 +753,7 @@ class EventRecorder(_EventFilter): def __init__(self, file, events_include, events_exclude): super().__init__() self.file = file + self.spuscen = [] # Prepare the recorded events stack; # the first entry is the protocol version @@ -797,6 +803,9 @@ def eventFilter(self, obj, event): serialized = self.resolver.getstate(obj, event) if serialized: self.events.append(serialized) + if is_skipped: + self.spuscen.append(EVENT_TYPE.get(event.type(), + 'Unknown(type=' + str(event.type()) + ')')) return False def close(self): @@ -807,6 +816,9 @@ def close(self): len(self.events) - SCENARIO_FORMAT_VERSION - 1, self.file.name) log.debug(self.events) + for i in set(self.spuscen): + log.info(i) + class EventReplayer(_EventFilter): def __init__(self, file): super().__init__()