微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决将继承的 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 举报,一经查实,本站将立刻删除。