我有一个C++类
MyClass
. 此类已注册为不可创建的类型,因此可以在QML中按名称引用。
MyClass.h
:
#pragma once
#include <QObject>
class MyClass : public QObject {
Q_OBJECT
public:
static void initQML();
MyClass();
MyClass(const MyClass &myClass);
~MyClass();
Q_INVOKABLE void printText();
};
MyClass.cpp
:
#include "MyClass.h"
#include <QtQml>
#include <QDebug>
#include <QMetaType>
void MyClass::initQML() {
qmlRegisterUncreatableType<const MyClass>("Test", 1, 0, "MyClass", "Don't create it");
qRegisterMetaType<const MyClass*>("const MyClass*");
}
MyClass::MyClass() {
qDebug() << "Constructor called.";
}
MyClass::MyClass(const MyClass &myClass) {
qDebug() << "Copy constructor called.";
}
MyClass::~MyClass() {
qDebug() << "Destructor called.";
}
void MyClass::printText() {
qDebug() << "This a sample text.";
}
我还有一门课叫
MyClassFactory
. 此类创建
类名
物体。它被注册为QML的单例类型。
MyClassFactory.h
:
#pragma once
#include "MyClass.h"
#include <QObject>
class MyClassFactory : public QObject {
Q_OBJECT
public:
static void initQML();
MyClassFactory();
public slots:
static const MyClass *makeDefaultMyClass();
};
MyClassFactory.cpp
:
#include "MyClassFactory.h"
#include <QtQml>
#include <QQmlEngine>
#include <QJSEngine>
QObject *simpleQmlRegisterSingletonTypeCallback(QQmlEngine *, QJSEngine *) {
return new MyClassFactory();
}
void MyClassFactory::initQML() {
qmlRegisterSingletonType<MyClassFactory>("Test", 1, 0, "MyClassFactory",
simpleQmlRegisterSingletonTypeCallback);
}
MyClassFactory::MyClassFactory() {}
const MyClass* MyClassFactory::makeDefaultMyClass() {
return new MyClass();
}
在我的
main.qml
类名
键入值并通过
. 这是我的
主.qml
import QtQuick 2.9
import QtQuick.Controls 2.2
import Test 1.0
ApplicationWindow {
visible: true
width: 480
height: 272
property MyClass myClass: MyClassFactory.makeDefaultMyClass()
Button {
anchors.centerIn: parent
text: "Create MyClass"
onClicked: myClass.printText()
}
}
生成并运行代码时,控制台中出现以下错误:
qrc:/main.qml:12: Error: Unknown method return type: const MyClass*
如果我注册
const MyClass*
作为一个元类型,这个错误消失了,但我得到了另一个错误:
qrc:/main.qml:12:31: Unable to assign const MyClass* to MyClass*
常量MyClass*
const MyClass
主要问题是如何将常量指针传递给QML?
作为一个完整的运行示例,下面是我的
main.cpp
:
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include "MyClass.h"
#include "MyClassFactory.h"
int main(int argc, char *argv[])
{
QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QGuiApplication app(argc, argv);
MyClass::initQML();
MyClassFactory::initQML();
QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
return app.exec();
}
我用qt5.9.5。