C++类要想被QML访问,首先必须满足两个条件:一是派生自QObject类或QObject类的子类,二是使用Q_OBJECT宏。
如果你声明了Q_OBJECT宏但在程序中并没有信号与反应槽或者注册类,对程序也不会有任何影响,所以建议大家在用Qt写程序时不妨都把这个宏加上
QObject类是所有Qt对象的基类,作为Qt对象模型的核心,提供了信号与槽机制等很多重要特性。
Q_OBJECT宏必须在private区(C++默认为private)声明,用来声明信号与槽,使用Qt元对象系统提供的内容,位置一般在语句块首行。
注册动作必须在QML上下文创建前,否则无效
Projects选择Qt Quick Application,工程名为Hello。
注册关键字有很多 qmlRegisterType是其中一种
其他关键字,比如使用qmlRegisterUncreatableType进行qml类型的注册时要在主函数中先进行实例化等操作 才能在qml中调用
模板函数注册C++类到Qt元对象系统中,PackageName是需要导入到QML中的库名,basVersion和subVersion是其版本数字,QmlTypeName是在QML中可以使用的类型名。
qmlRegisterType<CppClassName>("PackageName", basVersion, subVersion, "QmlTypeName")
调用方式如下:
import PackageName basVersion.subVersion
使用qmlRegisterType进行qml类型的注册
qml中cpp类的调用(以信号槽为例)
第一步、建立C++类 Hello.cpp
#ifndef HELLO_H
#define HELLO_H
#include <QObject>
#include <QDebug>
class Hello: public QObject
{
Q_OBJECT
public slots:
void doSomething()
{
qDebug() << "Hello::dosomething() is called.";
}
signals:
void begin();
};
#endif // HELLO_H
Hello类中的信号begin()和槽doSomething()都可以被QML访问。槽必须声明为public或protected,信号在C++中使用时要用到emit关键字,但在QML中就是个普通的函数,用法同函数一样,信号处理器形式为on,Signal首字母大写(必须大写 否则报错)。信号不支持重载,多个信号的名字相同而参数不同时,能够被识别的只是最后一个信号,与信号的参数无关。
第二步、注册C++类型 main.cpp
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QtQml>
#include "hello.h"
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
//注册C++类型Hello
//qmlRegisterType<CppClassName>("PackageName", basVersion, subVersion, "QmlTypeName")
qmlRegisterType<Hello>("Hello.module",1,0,"Hello");
QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
return app.exec();
}
第三步、在QML文件中导入C++类并使用
```cpp
import QtQuick 2.5
import QtQuick.Window 2.2
//导入注册的C++类 导入package名 加上两个版本号
// qmlRegisterType<Hello>("Hello.module",1,0,"Hello");
import Hello.module 1.0
//建立窗口
```qml
Window {
visible: true
width: 640
height: 480
title: qsTr("Hello QML")
MouseArea {
anchors.fill: parent
onClicked: {
hello.begin();//单击鼠标调用begin信号函数
}
}
//Hello类的实例
Hello{
id:hello
onBegin:doSomething()
}
}
https://blog.51cto.com/9291927/1975383
https://blog.csdn.net/cleverhorse/article/details/86494983