<div dir="ltr"><div><div><div><div><div><div><div><div><div>Hi everybody,<span style="font-family:courier new,monospace"><br><br></span></div>Is it possible to add a signal to a pyqt class from a class method (decorated with @classmethod) or from outside of the class?  I am somewhat surprised that the following does not work:<br>
<br></div>class C(Qt.QObject):<br></div>    def __init__(self):<br></div>        super().__init__()<br><br></div>C.fooSignal = Qt.pyqtSignal(int, name="fooSignal")<br></div>c = C()<br></div>c.fooSignal.emit(1)<br>
</div><div>!!!! AttributeError: 'C' does not have a signal with the signature fooSignal(int)<br></div><div><br></div>This arises because I'd like to programmatically generate and add a bunch of signals to a class before instantiating it.  It can be done with exec provided the exec call uses the default global and local dicts, leading me to suspect that there's some kind of magic absolutely requiring the current local and global namespaces to be in a very specific state.  For now, I actually use this as a workaround by having my class method generate a string that I then exec in the class definition, which is a bit ugly.<br>
<br></div>IPython transcript of test case:<br><div><div><div><div><div><div><div><div><div><div><div><div><div><div><span style="font-family:courier new,monospace"><br>> ipython<br>Python 3.4.1 (default, Jun 20 2014, 12:48:18) <br>
Type "copyright", "credits" or "license" for more information.<br><br>IPython 3.0.0-dev -- An enhanced Interactive Python.<br>?         -> Introduction and overview of IPython's features.<br>
%quickref -> Quick reference.<br>help      -> Python's own help system.<br>object?   -> Details about 'object', use 'object??' for extra details.<br>QML debugging is enabled. Only use this in a safe environment.<br>
<br>In [1]: class C(Qt.QObject):<br>   ...:     def __init__(self):<br>   ...:         super().__init__()<br>   ...:     exec('aSignal = Qt.pyqtSignal(bool)')<br>   ...:     @classmethod<br>   ...:     def make_bSignal(cls):<br>
   ...:         exec('cls.bSignal = Qt.pyqtSignal(bool, name="bSignal")')<br>   ...:         <br><br>In [2]: C.make_bSignal()<br><br>In [3]: C.cSignal = Qt.pyqtSignal(bool, name="cSignal")<br><br>
In [4]: c = C()<br><br>In [5]: c.dump<br>c.dumpObjectInfo  c.dumpObjectTree  <br><br>In [5]: c.dumpObjectInfo()<br>OBJECT C::unnamed<br>  SIGNALS OUT<br>        <None><br>  SIGNALS IN<br>        <None><br><br>
In [6]: c.aSignal.emit(True)<br><br>In [7]: c.bSignal.emit(True)<br>---------------------------------------------------------------------------<br>AttributeError                            Traceback (most recent call last)<br>
<ipython-input-7-116b5fc1d216> in <module>()<br>----> 1 c.bSignal.emit(True)<br><br>AttributeError: 'C' does not have a signal with the signature bSignal(bool)<br><br>In [8]: c.cSignal.emit(True)<br>
---------------------------------------------------------------------------<br>AttributeError                            Traceback (most recent call last)<br><ipython-input-8-c51ab45ecb54> in <module>()<br>----> 1 c.cSignal.emit(True)<br>
<br>AttributeError: 'C' does not have a signal with the signature cSignal(bool)<br><br>In [9]: quit()<br></span><br>Thanks,<br></div><div>Erik<br></div></div></div></div></div></div></div></div></div></div></div></div>
</div></div></div>