将继承的 QObject 的元对象注册到 QJSEngine

问题描述

我想继承QObject类,并将继承类的元对象注册一个qjsengine实例中,这样我就可以在JavaScript中调用let instance = new TrialObject();。这是我的代码

from PyQt6.QtQml import qjsengine
from PyQt6.QtCore import QCoreApplication,QObject


JS = """
(function() {
    let a = new TrialObject();
    return a;
})();
"""


class AttributeHandler(QObject):
    def __init__(self,parent=None):
        QObject.__init__(self,parent)


class Main:
    def __init__(self):

        self.jsHandler = qjsengine()
        self.jsHandler.globalObject().setProperty("TrialObject",self.jsHandler.newQMetaObject(QObject.staticMetaObject))

        r = self.jsHandler.evaluate(JS)

        print(r.toString())


if __name__ == "__main__":
    app = QCoreApplication([])
    main = Main()
    app.exec()

当(如上所述)我使用 QObject.staticMetaObject 作为 TrialObject 时,JavaScript 运行良好,并将 QObject 返回给 Python。因此 QObject 是可调用且有效的。但是当我尝试用 QObject.staticMetaObject 替换 AttributeHandler.staticMetaObject 时,出现错误

TypeError: AttributeHandler has no invokable constructor

... 显示 AttributeHandler 不可调用。 “可调用”是指 JavaScript 可以创建类 TrialObject 的新实例,我希望它是一个用 Python 创建并继承 QObject 的类。

如何将继承的 QObject 的元对象注册qjsengine 使其可调用 IE 可以在 JavaScript 中实例化新实例?

(PyQt6,Python 3.9,Windows 10)


编辑 1

运行AttributeHandler.staticMetaObject.constructorCount()返回0,而对于普通的QObject,它返回2,所以我认为问题在于构造函数实际上被识别元对象系统。 Q_INVOKABLEPyQt 中不存在,所以我尝试用 __init__ 装饰 pyqtSlot(),但这也没有预期的效果

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)