I would like to inherit the QObject class, and register the inherited class's meta object to a QJSEngine instance, so that I can call let instance = new TrialObject(); in JavaScript. Here is my code:
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()
When (as above), I use QObject.staticMetaObject as the TrialObject, the JavaScript runs fine, and returns the QObject back to Python. Therefore QObject is invokable and working. But when I try replacing QObject.staticMetaObject with AttributeHandler.staticMetaObject, I get the error:
TypeError: AttributeHandler has no invokable constructor
... showing that AttributeHandler is not invokable. By "invokable" I mean that JavaScript can create a new instance of the class TrialObject, which I would like to be a class that has been created in Python, and inherits QObject.
How can I register an inherited QObject's meta object to QJSEngine such that it is invokable IE a new instance can be instantiated in JavaScript?
(PyQt6, Python 3.9, Windows 10)
EDIT 1
Running AttributeHandler.staticMetaObject.constructorCount() returns 0, where-as for a normal QObject, it returns 2, so i think that the problem lies in the constructor actually being recognised by the meta object system. Q_INVOKABLE doesn't exist in PyQt, so I have tried decorating the __init__ with pyqtSlot(), but this doesn't have the deired effect either.