QT Qml 的qmlRegisterUncreatableType()函数

说明

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)
        }
    }

结果

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt QML是一种基于JavaScript的声明式语言,用于快速构建跨平台的用户界面。它有时需要与C++代码交互,因为C++可以提供更高性能和更底层的功能。 要在Qt QML中调用C函数,需要进行以下步骤: 1. 创建一个继承自QObject的C++类,并在其中定义所需的函数。这些函数需要使用Q_INVOKABLE宏进行标记,以便在QML中调用。 ```cpp // MyFunctions.h #include <QObject> class MyFunctions: public QObject { Q_OBJECT public: explicit MyFunctions(QObject *parent = nullptr); Q_INVOKABLE void myFunction(); }; ``` 2. 在QML文件中导入C++类,并使用其实例调用函数。 ```qml import MyFunctions 1.0 Window { // ... Button { text: "调用C函数" onClicked: { MyFunctions.myFunction(); } } // ... } ``` 3. 在C++代码中将该类注册到QML引擎中。 ```cpp // main.cpp #include <QGuiApplication> #include <QQmlApplicationEngine> #include "MyFunctions.h" int main(int argc, char *argv[]) { QGuiApplication app(argc, argv); qmlRegisterType<MyFunctions>("MyFunctions", 1, 0, "MyFunctions"); QQmlApplicationEngine engine; engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); return app.exec(); } ``` 通过以上步骤,就可以在Qt QML中成功调用C函数了。在按钮点击事件中调用C++类的函数,可以在C++代码中执行所需的操作,并将结果返回到QML界面中进行展示。这种方式可以实现Qt QML框架与C++高性能功能的结合,使得开发者能够更好地发挥Qt的优秀特性和灵活性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值