QML实战笔记4——QML和C++混合编程

在QML中调用C++

1.首先创建c++类

      如果想在QML中使用C++枚举,可以使用Q_ENUMS宏将该枚举注册到元对象系统中。

如:

enum color
{
     red,
     green,
};

Q_ENUMS(color)

    如果想通过元对象系统访问C++类的属性,可以使用Q_PROPERTY。如:

Q_PROPERTY(QColor color READ color WRITE setColor NOTIFY colorChanged)
//READ: 声明一个读取属性的函数
//WRITE:[可选]声明一个设定属性的函数
//NOTIFY:[可选]给属性关联一个信号,该信号必须是在类中已经声明过的

    在定义一个类的成员函数时使用Q_INVOKABLE宏来修饰,可让该方法被元对象系统调用。这个宏必须放在返回类型前面。如:

Q_INVOKABLE color selectedColor() const;

2.在QML中调用C++,可以注册一个QML模型(单例模型),也可以在C++中直接创建对象。

方法一:注册模型

int main(int argc, char *argv[])
{
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    QGuiApplication app(argc, argv); 
    qmlRegisterType<Color>("qt.an.color", 1, 0, "Color");//注册qml类型
//  "qt.an.color":指定一个唯一包名。避免名字冲突,把多个相关类聚合到一个包中方便使用。
//  1, 0: 版本号
// "Color":在QML中可以使用的类名
    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    if (engine.rootObjects().isEmpty())
        return -1;
    return app.exec();
}

在QML文件中导入包。

import qt.an.color 1.0

创建C++对象。

Color {
   id: color;
}

方法二:在C++中创建对象,QML中无须再创建

int main(int argc, char *argv[])
{
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    QGuiApplication app(argc, argv);
    QQmlApplicationEngine engine;

    engine.rootContext()->setContextProperty("color", new Color);//注册对象,qml中无须注册可直接使用

    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    if (engine.rootObjects().isEmpty())
        return -1;
    return app.exec();
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值