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();
}
发布了9 篇原创文章 · 获赞 3 · 访问量 900

猜你喜欢

转载自blog.csdn.net/qq_23516957/article/details/96288418