说明
qmlRegisterUncreatableType()将c++类(派生自QObject)注册到QML系统(注册为非实例化类型)。但是我们不能在qml文件中为类创建对象,我们需要在qml文件中使用属性枚举方式来调用。
若QML要访问类里的枚举值必须使用以下宏将其提供给QML系统,否则无法访问。
Q_ENUMS(enumType)
用qml类型系统注册c++类型
qmlRegisterUncreatableType("ModuleName/uri", MajorVersion, MinorVersion, "QmlName", "message");
范例
main.cpp
#include <QApplication>
#include <QQmlApplicationEngine>
#include <QtQml>
#include "mycppclass.h"
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
MyCPPClass myCppObj;
qmlRegisterUncreatableType<MyCPPClass>("MyModule",1,0,"MyCPPClass","can not instantiate MyCPPClass in qml");
QQmlApplicationEngine engine;
engine.rootContext()->setContextProperty("myCppObj",&myCppObj);
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
return app.exec();
}
MyCPPClass.h
#include <QObject>
#include <QString>
#include<QColor>
class MyCPPClass : public QObject
{
Q_OBJECT
Q_PROPERTY(QColor mycolour READ mycolour WRITE setMycolour NOTIFY mycolourChanged)
Q_PROPERTY(int num READ num WRITE setNum NOTIFY numChanged)
Q_ENUMS(NumbersType)
public:
explicit MyCPPClass(QObject *parent = 0);
QColor mycolour();
void setMycolour(QColor clr);
int num();
void setNum(int n);
Q_INVOKABLE QString getClassName();
enum NumbersType {
ONE = 1,
TWO = 2,
THREE = 3,
FOUR= 4,
FIVE = 5,
SIX = 6,
SEVEN =7 ,
EIGHT = 8,
Nine = 9
};
signals:
void mycolourChanged();
void numChanged();
public slots:
private:
QColor m_colour;
int m_num;
};
MyCPPClass.cpp
#include "mycppclass.h"
MyCPPClass::MyCPPClass(QObject *parent) : QObject(parent)
{
}
QColor MyCPPClass::mycolour()
{
return m_colour;
}
void MyCPPClass::setMycolour(QColor clr)
{
m_colour = clr;
Q_EMIT mycolourChanged();
}
int MyCPPClass::num()
{
return m_num;
}
void MyCPPClass::setNum(int n)
{
m_num = n;
Q_EMIT numChanged();
}
QString MyCPPClass::getClassName()
{
return "MyCPPClass";
}
main.qml
import QtQuick 2.4
import MyModule 1.0
Rectangle {
Component.onCompleted: {
myCppObj.mycolour = "red"
myCppObj.num = 300;
}
height: myCppObj.num
width: myCppObj.num
color: myCppObj.mycolour
Text {
id: name
text: qsTr("This is from C++ class:\t"+myCppObj.getClassName()+" \n enum value: "+MyCPPClass.EIGHT)
}
}