[PyQt] Re: Bug ovverriding sizeHint

Phil Thompson phil at riverbankcomputing.co.uk
Mon Feb 25 09:29:27 GMT 2008


On Friday 22 February 2008, Giovanni Bajo wrote:
> Hi,
>
> consider this snippet:
>
> =======================================================
> from PyQt4.Qt import *
> app = QApplication([])
> w = QWidget()
> L = QVBoxLayout(w)
> L.addWidget(QLabel("ciao", w))
>
> called_class = []
> class MyScrollArea(QScrollArea):
>      def sizeHint(self):
>          called_class.append(1)
>          return QSize(100,100)
>
> called_func = []
> def mySizeHint(*args):
>      called_func.append(1)
>      return QSize(100,100)
>
> sv = MyScrollArea(w)
> sv.sizeHint = mySizeHint    # the trick!
>
> L.addWidget(sv)
> L.activate()
> assert not called_class
> assert called_func
> =======================================================
> Traceback (most recent call last):
>    File "sizehint.py", line 24, in ?
>      assert called_func
> AssertionError
>
> My understanding is that the function "mySizeHint()" should be called
> while calculating the size, as it was overridden. What happens is that,
> misteriously, *neither* sizeHint() function is called.
>
> Of course, if you comment the marked line, the overridden method is
> called, as expected.

SIP is looking for a method to invoke - not just a callable. See the 
implementation of sip_api_is_py_method() in siplib.c.

Phil


More information about the PyQt mailing list