[PyQt] PyQt support for Qt 4.7

Giovanni Bajo rasky at develer.com
Sun Oct 10 12:16:05 BST 2010


On ven, 2010-10-08 at 11:04 +0100, Phil Thompson wrote:
> On Fri, 08 Oct 2010 09:05:47 +0100, Phil Thompson
> <phil at riverbankcomputing.com> wrote:
> > On Fri, 08 Oct 2010 01:08:08 +0200, Giovanni Bajo <rasky at develer.com>
> > wrote:
> >> On Thu, 07 Oct 2010 16:34:41 +0100, Phil Thompson
> >> <phil at riverbankcomputing.com> wrote:
> >>> On Thu, 7 Oct 2010 00:35:16 +0200, David Boddie <david at boddie.org.uk>
> >>> wrote:
> >>>> On Tue Oct 5 09:36:49 BST 2010, Phil Thompson wrote:
> >>>> 
> >>>>> The minehunt example only seems to need support for lists of
> > QObjects.
> >>>>> Are
> >>>>> there any other examples anywhere that have different use cases?
> >>>> 
> >>>> I guess that's more or less what it is, though it needs something
> > extra
> >>> to
> >>>> make the QML engine aware of the new TileData type, used as a
> property
> >>> type
> >>>> in the MinehuntGame class, and used as the model that holds the tile
> >>> data
> >>>> in
> >>>> the game. If you can figure out a way to expose homogeneous Python
> >> lists
> >>> as
> >>>> QDeclarativeListProperty containers then that would be cool.
> >>> 
> >>> Done that.
> >>> 
> >>>> Looking through the examples, there are places where qmlRegisterType
> > is
> >>>> used
> >>>> to add C++ classes to QML as new item types. The "Writing QML
> >> extensions
> >>>> with
> >>>> C++" tutorial in examples/declarative/tutorials/extending is one of
> >>> these.
> >>> 
> >>> ...and there we hit the showstopper.
> >>> 
> >>> It looks like it is not possible to publish Python types to QML (and
> > use
> >>> the QML import statement) because QML uses a QObject's
> staticMetaObject
> >>> instead of calling metaObject(). That automatically limits it to types
> >>> known at compile time and no way to inject dynamic meta-objects
> created
> >> at
> >>> run time.
> >> 
> >> I think that's because they need to construct new instances for that
> > type
> >> at runtime. I can't see how an object could be instantiated through a
> >> pointer to its QMetaObject instance (let alone a *dynamic* meta
> object).
> >> You would probably need to add a different qmlRegisterType() overload
> > that
> >> gets a QMetaObject* and a pointer to a factory function that
> > instantiates
> >> objects of that type.
> >> 
> >> Until you agree with Nokia on a design for this, as a temporary
> >> workaround, you could generate a fixed pool (eg: N=16) of static
> objects
> >> that can be registered in place of the dynamic object; basically, when
> > the
> >> pyqt user calls qmlRegisterType(), you fetch the next static object,
> > make
> >> it a "delegator" for the user's dynamic object, and register that to
> > qml. I
> >> think it might be sufficient to duplicate the metaobject information
> and
> >> then forward a few functions like invoke().
> >> 
> >> It's ugly, but at least it's all internal to PyQt and you can expose
> the
> >> correct API to Python users. When you get this fixed with Nokia, you
> can
> >> skip all this.
> > 
> > I've adopted that technique (at your suggestion) elsewhere in PyQt. I
> keep
> > forgetting about it because it is so ugly :)
> > 
> > I'll have a think...
> 
> ...unfortunately it doesn't help. QML is checking the static meta-object
> to see if a property is valid, so it can only handle properties that are
> known at compile time.

Eww.. I'll see if I can find someone to blame at Developer Days
tomorrow :)
-- 
Giovanni Bajo      ::  Develer S.r.l.
rasky at develer.com  ::  http://www.develer.com

Blog: http://giovanni.bajo.it
Last post: Compile-time Function Execution in D



More information about the PyQt mailing list