[PyQt] super()

Carlos Scheidegger cscheid at sci.utah.edu
Wed Jul 18 22:32:29 BST 2007


Hello,

Is there a recommended way of using super() on PyQt objects? Is that
considered in general a horrible idea? Here's the problem. We have a few mixin
classes we use in our code, and we multiply inherit them. Some of these mixins
change the event handling behavior. Here's a simple example:

class Mixin(object):

    def moveEvent(self, event):
        do_something_here()
        super(Mixin, self).moveEvent(event)

class SomeBaseWidget(QtGui.QWidget, Mixin):

    ...

class SomeDerivedWidget(SomeBaseWidget):

    def moveEvent(self, event):
        do_yet_another_thing()

        # This calls Mixin, and Mixin calls QtGui.QWidget.moveEvent
        super(SomeDerivedWidget, self).moveEvent(event)

This particular example works fine. For uniformity, however, I would like to
use super() in all call sites that pass the event to the parent class.
However, this fails with "AttributeError: 'super' object has no attribute
'moveEvent'.":

class VanillaWidget(QtGui.QWidget):

    def moveEvent(self, event):
        super(VanillaWidget, self).moveEvent(event)

it seems the proxy object returned by subject is not dispatching the call to
where I expected it to. This is easy to exercise with the following patches to
t5.py. The first patch works fine:

+++ t5.py       2007-07-18 15:23:45.000000000 -0600
@@ -30,6 +30,10 @@
         layout.addWidget(lcd);
         layout.addWidget(slider);
         self.setLayout(layout);
+
+    def moveEvent(self, event):
+        print "Called"
+        QtGui.QWidget.moveEvent(self, event)

 app = QtGui.QApplication(sys.argv)
 widget = MyWidget()

The second patch raises errors:

+++ t5_bad.py   2007-07-18 15:24:25.000000000 -0600
@@ -30,6 +30,10 @@
         layout.addWidget(lcd);
         layout.addWidget(slider);
         self.setLayout(layout);
+
+    def moveEvent(self, event):
+        print "Called"
+        super(MyWidget, self).moveEvent(event)

 app = QtGui.QApplication(sys.argv)
 widget = MyWidget()


I would like all the function calls to be consistent so that there's less
risks of future gotchas when changing classes to use mixins. Is multiple
inheritance in PyQt generally considered a bad idea? What are PyQt best
practices when it comes to mixins?

Thanks very much in advance,
-carlos


More information about the PyQt mailing list