[PyKDE] QWidgetFactory and classes defined in Python

Yann Cointepas yann at sapetnioc.org
Wed Oct 5 22:46:19 BST 2005


I am sorry, there is an error in the example code I sent. The las line of 
testQWidgetFactory.py should have been:

w.child( 'myCustomWidget1' ).pythonMethod()

The behaviour is different on various PyQt/sip versions. The problem is 
related to the deletion of the Python version of MyCustomWidget instance 
which is local to MyWidgetFactory.createWidget(). If I keep a reference on 
this widget (for example in a global variable), the link between the C++ 
QWidget and its Python counterpart is never lost.

Is it mandatory to always keep somewhere a Python reference on a QWidget to be 
able to get this Python object from pure C++ methods returning QWidget * ?

> Hi,
>
> PyQt loose the link between a Python QWidget subclass and the corresponding
> C++ object when using QWidgetFactory.
>
> In the following example, a simple custom widget for designer is created in
> Python. QWidgetFactory is specialized to create custom widget instances and
> registered it with  QWidgetFactory.addFactory. Then a simple .ui file is
> using this custom widget. It almost work but the widget returned by
> QWidgetFactory.create() do not have access to the Python methods defined in
> its class. Is there a way to go around this problem ?
>
> Regards,
>
>       Yann Cointepas
>
>
> The example is composed of form1.ui and testQWidgetFactory.py and produces
> the following output:
>
> $> python testQWidgetFactory.py
> MyCustomWidget.__init__ <__main__.MyCustomWidget object at 0xb7efaaac>
> Created widget from .ui file: <qt.QWidget object at 0xb7efaaac>
> Traceback (most recent call last):
>   File "testQWidgetFactory.py", line 22, in ?
>     w.pythonMethod()
> AttributeError: pythonMethod
>
> ---------- testQWidgetFactory.py ----------
> import sys
> import qt
> import qtui
>
> class MyCustomWidget( qt.QWidget ):
>   def __init__( self, parent=None, name=None ):
>     qt.QWidget.__init__( self, parent, name )
>     print 'MyCustomWidget.__init__', self
>
>   def pythonMethod( self ):
>     print 'in MyCustomWidget.pythonMethod()'
>
> class MyWidgetFactory( qtui.QWidgetFactory ):
>   def createWidget( self, className, parent, name ):
>     if className == 'MyCustomWidget':
>       return MyCustomWidget( parent, name )
>
> qApp = qt.QApplication( sys.argv )
> qtui.QWidgetFactory.addWidgetFactory( MyWidgetFactory() )
> w = qtui.QWidgetFactory.create( 'form1.ui' )
> print 'Created widget from .ui file:', w
> w.pythonMethod()
>
>
> ---------- form1.ui ----------
> <!DOCTYPE UI><UI version="3.3" stdsetdef="1">
> <class>Form1</class>
> <widget class="QWidget">
>     <property name="name">
>         <cstring>Form1</cstring>
>     </property>
>     <property name="geometry">
>         <rect>
>             <x>0</x>
>             <y>0</y>
>             <width>600</width>
>             <height>480</height>
>         </rect>
>     </property>
>     <property name="caption">
>         <string>Form1</string>
>     </property>
>     <widget class="MyCustomWidget">
>         <property name="name">
>             <cstring>myCustomWidget1</cstring>
>         </property>
>         <property name="geometry">
>             <rect>
>                 <x>170</x>
>                 <y>110</y>
>                 <width>261</width>
>                 <height>161</height>
>             </rect>
>         </property>
>     </widget>
> </widget>
> <customwidgets>
>     <customwidget>
>         <class>MyCustomWidget</class>
>         <header location="local">mywidget.h</header>
>         <sizehint>
>             <width>-1</width>
>             <height>40</height>
>         </sizehint>
>         <container>0</container>
>         <sizepolicy>
>             <hordata>5</hordata>
>             <verdata>5</verdata>
>             <horstretch>0</horstretch>
>             <verstretch>0</verstretch>
>         </sizepolicy>
>         <pixmap>image0</pixmap>
>     </customwidget>
> </customwidgets>
> <images>
>     <image name="image0">
>         <data format="PNG"
> length="1125">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b
>46c3b0000042c49444154388db5954f6c14551cc73fefcd7476b65bdaae4bb78bb5502a14d40
>4e4801c88182d1c4c2c693da847400f9c24c68b878684238660e2b1e01f12c19493012ef2478
>c814412d354a46017a8a564bb6da5bbedccee767776e63d0ffb073751d483bfe49799974c3ee
>ffb7ebf37df9fd05a530b2184040cc0042420aaf9a4d0d554800f045a6b256ae0e1e1e1d6beb
>ebe838ee31c48a7d39b5cd7fd075e251cc7617272f2ded8d8d819cff33e0316819259537aead
>4a9839d5dd6d1784f91f55b0a94830242088404d304292bef68a89f520802a598fecddaa04f1
>a876f5c250c7c0a64cdeac686e33807e23d45e6b297c8b877f1831542614550b6599835c83c2
>a81b6786a75134faf2f1169f12997350881d9021d0903e06de0745d3160a6d3e94dbd5b0a64d
>cbb94b5831d0e3375ab892b1772dcf9790528543f8dd0d367b36768153b5e31503a0f1aecb00
>4580b44ffac58baae8b1714f0833c7638cc8dab303a320f4822ab4c7a37c69196203de3319d5
>ce1c4d13c733331dedc67a129a154fd128401ab0616d55a130ac3d42d93d1913940d13fd0c9e
>e0183685c60da01c5421bd72f7a8c8efccef9afd374267ad93d642365be0636a0d28ec760094
>1d9e6f23917f0e97f23ce5bef35d19ec863da0ed9059b2be70bec196c66dfa10ec0e49b338f7
>017258651bf95021035c595429bb0903248fe52a2b5b595dd7b4d945cc2340cdca536be389ee
>3f67886c5798f773fe8e0dac508c989659277a2180da4ca4ff07821058b8b251445d63d6b13e
>d1098a6417e39cac85197dbe31962ab9bd9f1f22a226d45366f6d0620fdb08c900d281af6110
>284b20085b414861d905d88f2e52739ee8cbb8022143259d3dd84691730aa2d52da441a8de0c
>6958068870022a41e9629ad3473fd3b8fdbe319dadb9b4924da994d2d716c7896fbe35152f78
>b48245d6b2da4507faf582be8eaf159b721cc837b05ae7debb1f79d08cb8b515edad942a22bc
>4b1c33eb3d34b1c797f06af90a72d16e2f96d9a74aa11dca8586b222d01af0fb60070f6c402d
>72f15d97f28c6f6d7027a5f5ce6c3233dc4e2ede496b278be4fff608cee8d3e1add806aeca51
>094cbb06397c1ecc328e746537c7e3ccdb5cb1136bf60635882d4d41c6ec6836ab37efa214f7
>2208ed9f4d7cdd38ee310280542e38b1c43fb6de26b3672e1ec3cc99bcb246f66a938a3241ab
>3e91f7c861fbf77710b1e5e49915bae974203ba0e9e9c9cbc373d6d6d305a040a89c2a77f50b
>27d5782bbbf7acccf28349235dd16cf6dd374f7295e1de8a45c02d37499182b01cc0201a085d
>61a2144d8b2ac8fb6ed340e77240c4261890e04c250185262546d534a032154b59e0ad394e41
>c98182bf268ce6721ed9f064e0253356f6da2e24c1f030f783c15fe6da680af8021602bd0515
>32ca9b8521488559f61aa86c29343578fbf0264a94c906c7d3409214c20043457a116ff6de67
>95578012889ff6b98fe016ea0ce1c6a2573410000000049454e44ae426082</data>
> </image>
> </images>
> <layoutdefaults spacing="6" margin="11"/>
> <includehints>
>     <includehint>mycustomwidget.h</includehint>
> </includehints>
> </UI>

-- 
Yann Cointepas                         Tel: +33 1 69 86 78 52
CEA - SHFJ                             Fax: +33 1 69 86 77 86
4, place du Général Leclerc
91401 Orsay Cedex France




More information about the PyQt mailing list