数百万对象的pythonqt的可伸缩性

时间:2011-05-30 21:35:28

标签: c++ python qt

我在考虑将pythonqt添加到我的应用程序来编写插件。我的应用程序是用C ++编写的,并且已经使用了Qt框架。 pythonqt选项似乎非常适合添加GUI组件,但我担心如果我公开一个包含数百万个实例的类,程序将如何扩展。在内存中有一百万个特定类型的对象并不常见,我想确保pythonqt能够在不使它们成为QObject的情况下暴露这些对象。我想这可能没问题,但在我开始之前,我想知道如果使用pythonqt暴露如此大量的类是否实用,并且如果有人有任何扩展它的经验。

从这个链接(http://pythonqt.sourceforge.net/Developer.html)看来,装饰者实际上只是根据请求将它们加载到python / Qt中。我只是不希望Qt更大的内存占用,试图无缘无故地跟踪这些数百万个对象。

2 个答案:

答案 0 :(得分:2)

PythonQt仅为暴露给Python的C ++实例创建Python包装器。 因此,如果您不同时向Python公开数百万个C ++实例, 它将很好地扩展并仅为暴露的对象创建包装器。 当这些包装器在Python中超出范围时会被删除,所以这也应该扩展。

包装C ++对象的最佳方法是为每个C ++类注册一个装饰器QObject派生类,这允许注册许多类,而不实际创建/评估装饰器,直到该类的类变得对Python可见。 看看Qt包装器,例如PythonQtWrapper_QImage,用于查看这样的装饰器的外观以及它是如何注册的。

答案 1 :(得分:0)

我没有做太多,但几乎听起来你应该至少看看QtQuick / QML层。很难从你的描述中看出发生了什么,但QML是一种在不进行任何C ++编码的情况下编写Qt GUI的方法。它建立在已经存在且运行良好的Qt / JavaScript实现和桥梁的基础之上。

至于将类的实例暴露给脚本语言,这通常取决于桥的实现。虽然通常会涉及一些代码,但您可能不会在每个实例中产生这种情况,或者它可能会被懒惰地实例化到一个点,在这个点上,您将只有比您在内存中保存的原始数据少得多的数百万个包装实例。