在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();
}