[PyQt] Fwd: Mixin classes and PyQt4

Phil Thompson phil at riverbankcomputing.com
Tue Mar 4 17:06:46 GMT 2014


On 16-02-2014 1:27 pm, Phil Thompson wrote:
> On 12-02-2014 9:55 pm, Baz Walter wrote:
>> On 12/02/14 09:35, Martin Teichmann wrote:
>>> Hi Phil, Hi Baz, Hi List,
>>>
>>> I just wrote a patch as advertised earlier, which checks that the
>>> inheritance is correct and that noone attempts to inherit from more
>>> than one PyQt base class. It is based on the patch sent earlier.
>>> Maybe this is an improvement enough to put my patches in?
>>
>> This actually only relates to multiple-inheritance. It should never
>> be problem for true mixin classes.
>>
>> The one genuine issue with mixins in PyQt, is that you cannot 
>> inherit
>> custom signals.
>>
>> In PySide, I can do this:
>>
>>>>> from PySide import QtCore, QtGui
>>>>> app = QtGui.QApplication([])
>>>>> class A(object):
>> ...     sig = QtCore.Signal(int)
>> ...
>>>>> class B(A, QtGui.QLabel):
>> ...     def __init__(self):
>> ...         super(B, self).__init__()
>> ...         self.sig.connect(self.bar)
>> ...     def foo(self): self.sig.emit(42)
>> ...     def bar(self, i): print(i)
>> ...
>>>>> b = B()
>>>>> b.foo()
>> 42
>>
>> I understand that Qt itself doesn't allow this, but is there a
>> technical reason why this is not possible in PyQt? There is a real,
>> practical need for this functionality (code reuse), and its galling
>> that PySide allows it but PyQt doesn't.
>
> It's technically possible, just a bit of a hack. Consider...
>
> class A(object):
>     sigA = pyqtSignal()
>
> class B(A):
>     pass
>
> class C(object):
>     sigC = pyqtSignal()
>
> class MyLabel(C, QLabel):
>     pass
>
> class Z(B, MyLabel):
>     pass
>
> It needs to work out that the QMetaObject for Z must include sigA but
> not sigC.

This is implemented in tonight's PyQt5 snapshot.

Phil


More information about the PyQt mailing list