一, 在QML中访问C++类和对象
1)导出类型到QML
第一步 ,实现一个C++类: Class A
实现A的一些条件:
1,从 QObject 或 QObject 的派生类继承
2,使用 Q_OBJECT 宏
(这两个条件是为了让一个类能够进入 Qt 的元对象系统(meta-object system)中,只有使用元对象系统,一个类的某些方法或属性才可能通过字符串形式的名字来调用,才具有了在 QML 中访问的基础条件。)
3,类的成员函数使用 Q_INVOKABLE 宏来修饰,让该方法被元对象系统调用, QML 中用 ${Object}.${method} 来访问.
定义: Q_INVOKABLE void fun();
QML中, A.fun();
4, 枚举类型用Q_ENUMS宏, QML 中用 ${CLASS_NAME}.${ENUM_VALUE} 的形式来访问
Q_ENUMS(ITEM)
enum ITEM{X,Y,Z};
QML中, A.X;
5, Q_PROPERTY 宏定义可通过元对象系统访问的属性,可以在 QML 中访问、修改,也可以在属性变化时发射特定的信号。
Q_PROPERTY(QString name READ name WRITE setName)
第二步: 注册类A到QML类型 (注册动作要放在 QML 上下文创建之前)
qmlRegisterType<A>("an.qt.A", 1, 0, "A"); //参数分别是包名,主版本,次版本,类名
第三步: 在QML中导入注册的类型A
import an.qt.A 1.0
第四步:在 QML 中创建 A的实例
- Rectangle {
- width: 360;
- height: 360;
- A {
- id: a1;
- name: qsTr("Class A");
- }
- }
2)导出对象到QML:
上面是导出QML 类型在 QML中使用,还可以把 C++ 中创建的对象传递到 QML 环境中,然后在 QML 环境中访问
- QtQuick2ApplicationViewer viewer;
- viewer.rootContext()->setContextProperty("objectA", new A);
- Component.onCompleted: {
- objectA.name = qsTr("Class A");
- objectA.fun();
- ...
- }
-
- import QtQuick 2.0
- import QtQuick.Controls 1.1
- Rectangle {
- objectName: "rootRect";
- width: 360;
- height: 360;
- Text {
- objectName: "textLabel";
- text: "Hello World";
- anchors.centerIn: parent;
- font.pixelSize: 26;
- }
- Button {
- anchors.right: parent.right;
- anchors.rightMargin: 4;
- anchors.bottom: parent.bottom;
- anchors.bottomMargin: 4;
- text: "quit";
- objectName: "quitButton";
- }
- }
- int main(int argc, char *argv[])
- {
- QGuiApplication app(argc, argv);
- QtQuick2ApplicationViewer viewer;
- viewer.setMainQmlFile(QStringLiteral("qml/callQml/objectb.qml"));
- viewer.showExpanded();
- QQuickItem * rootItem = viewer.rootObject();
- if(quitButton)
- {
- QObject::connect(quitButton, SIGNAL(clicked()), &app, SLOT(quit()));
- }
- QObject *textLabel = rootItem->findChild<QObject*>("textLabel");
- if(textLabel)
- {
- //1. failed call
- bool bRet = QMetaObject::invokeMethod(textLabel, "setText", Q_ARG(QString, "world hello"));
- qDebug() << "call setText return - " << bRet;
- textLabel->setProperty("color", QColor::fromRgb(255,0,0));
- bRet = QMetaObject::invokeMethod(textLabel, "doLayout");
- qDebug() << "call doLayout return - " << bRet;
- }
- return app.exec();
- }