Unsolved Expose a C++ typedef to QML
-
How can I make QML engine to recognize C++ typedef? I tried to define my type both by
using
andtypedef
:
Header file:using primary_key = qint64; // or typedef qint64 primary_key; Q_DECLARE_METATYPE(primary_key)
Source file:
void init_db() { qRegisterMetaType<primary_key>(); ... }
But when I call a Q_INVOKABLE function which returns primary_key, I get "Unknown method return type" error at runtime.
-
This post is deleted! -
First of all a line from the docs:
To use the type T in queued signal and slot connections, qRegisterMetaType<T>() must be called before the first connection is established.
Maybe you could try to move
qRegisterMetaType<primary_key>();
into the constructor of the class. -
@ttuna Thanks, but I'm not using the type in signal and slot connections.
-
@m_andrej said:
@ttuna Thanks, but I'm not using the type in signal and slot connections.
Not having signals emitted by your own does not mean that Qt doesn't in the background.
If QmlEngine and your QObject are living in different threads i think they'll communicate over signal / slot.
I ran into a similar problems and because the situation in your code example isn't clear i thought it's worth a shot. -
@ttuna OK, I see. But I'm calling
qRegisterMetaType<primary_key>();
before QmlEngine is even created. Sorry for not mentioning this at the first time. -
Maybe you can post a more detailed code example because it's difficult to take all possible scenarios into account (e.g. different namespaces, ...)
-
Here is the complete example:
TestClass.h (doesn't have a cpp file):
#pragma once #include <QObject> using primary_key = qint64; class TestClass : public QObject { Q_OBJECT public: explicit TestClass(QObject *parent = 0) : QObject(parent) {} Q_INVOKABLE primary_key lastInsertRowid() { return 0; } }; Q_DECLARE_METATYPE(primary_key)
main.cpp:
#include <QGuiApplication> #include <QQmlApplicationEngine> #include <QtQml> #include "TestClass.h" int main(int argc, char *argv[]) { QGuiApplication app(argc, argv); qRegisterMetaType<primary_key>(); qmlRegisterType<TestClass>("pokus", 1, 0, "TestClass"); QQmlApplicationEngine engine; engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); return app.exec(); }
main.qml:
import QtQuick 2.4 import QtQuick.Controls 1.1 import QtQuick.Window 2.2 import pokus 1.0 Window { visible: true Button { anchors.centerIn: parent text: "Klikni" onClicked: console.log(testObj.lastInsertRowid()) } TestClass { id: testObj } }
When I run the program and click the button, I get
qrc:/main.qml:14: Error: Unknown method return type: primary_key
.