[PyQt] strange behavior in PyQt4/uic/uiparser.py of PyQt4 4.3.3

Phil Thompson phil at riverbankcomputing.com
Fri Apr 25 07:39:58 BST 2008


On Friday 25 April 2008, Alberto Berti wrote:
> Hello all,
>
> I have some code that while uiparser.py reads an .ui file, it hooks in
> the process and binds the widget to the correct data context (read:
> tablemodel). It uses the child to parent widget "navigation" using
> QObject.parent() to find out the correct context for a widget. It
> works very well, except for some cases where parent chain is broken
> and so an exception is raised. This error happens only when one of the
> widgets which are "decorated" is  contained, for example, in a
> QTabWidget's page. The interesting piece of the .ui file appears like
> this:
>
>       <widget class="QTabWidget" name="tabWidget" >
> 	<property name="geometry" >
> 	  <rect>
>           ...
> 	  </rect>
> 	</property>
> 	<property name="tabShape" >
> 	  <enum>QTabWidget::Rounded</enum>
>        </property>
>        <widget class="QWidget" name="tab" >
> 	 <property name="geometry" >
> 	   <rect>
>            ...
> 	   </rect>
> 	 </property>
> 	 <attribute name="title" >
> 	   <string>Tab 1</string>
> 	 </attribute>
> 	 <widget class="QComboBox" name="tipologiaoperazione" >
> 	   <property name="geometry" >
> 	     <rect>
>              ...
> 	     </rect>
> 	   </property>
> 	   <property name="column" stdset="0" >
> 	     <string>tipologiaoperazione</string>
> 	   </property>
> 	 </widget>
>        </widget>
>       </widget>
>
>
> So the QTabWidget's page is "rendered" by Qt Designer as a simple
> QWidget, and this is the object where the .parent() chain
> breaks. While looking for source of this problem, I discovered a
> strange piece of code in UIParser.createWidget() around line 147:
>
>      parent = self.stack.topwidget
>      if isinstance(parent, (QtGui.QToolBox, QtGui.QTabWidget,
>                             QtGui.QStackedWidget)):
>          parent = None
>          #^^^^^^^^^^^^^^here is the strange point
>
>      self.stack.push(self.setupObject(widgetClass(elem), parent, elem))
>                      #^^^^^^^^^^^^^^^ this calls my code
>
> So in this case, the parent object is deliberately set to None when
> the QTabWidget's page gets created!
>
> What's the reason of such behavior?
>
> Please note that if i replace the "parent = None" line with a "pass"
> all goes on fine an the form shown without any problems, with the
> right page shown and the tab swiching working fine.

I can't answer the question as I didn't write the original code.

Phil


More information about the PyQt mailing list