Source code for eye.qt

# this project is licensed under the WTFPLv2, see COPYING.txt for details

"""Helpers for use with Qt"""

import inspect
import os
import re

from PyQt5.QtCore import pyqtSlot, pyqtSignal

from eye import _add_doc

__all__ = ('Slot', 'Signal')


SLOT_RE = re.compile(r'@(?:\w\.)*Slot(\(.*\))')


[docs] def Slot(*args, **kwargs): def decorator(func): if os.environ.get('READTHEDOCS') != 'True': func = pyqtSlot(*args, **kwargs)(func) signatures = [] for srcline in inspect.getsourcelines(func)[0]: srcline = srcline.strip() mtc = SLOT_RE.match(srcline) if mtc: signatures.append(mtc.group(1)) elif srcline.startswith('def '): break text = '\n\n'.join('This slot has signature ``%s%s``.' % (func.__name__, sig) for sig in signatures) _add_doc(func, text) return func return decorator
class SignalDoc: def __init__(self, *types): self.types = types def _type_string(self, t): if isinstance(t, type): return t.__name__ return repr(t) def __repr__(self): if not self.types or isinstance(self.types[0], type): return 'Signal(%s)' % ', '.join(self._type_string(t) for t in self.types) return ' '.join(repr(SignalDoc(*arg)) for arg in self.types) def connect(self, *args, **kwargs): pass
[docs] def Signal(*args, **kwargs): if os.environ.get('READTHEDOCS') != 'True': return pyqtSignal(*args, **kwargs) return SignalDoc(*args, **kwargs)
def override(func): text = '*Overrides a Qt method.*' _add_doc(func, text) return func