欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Qt 5.12学习笔记--QML and C++ 混编示例

程序员文章站 2022-07-12 15:34:46
...

1 简介

QML被设计为可通过C ++代码轻松扩展。 Qt QML模块中的类允许从C ++加载和处理QML对象,并且QML引擎与Qt的元对象系统集成的性质使C ++功能可以直接从QML调用。 这允许开发混合应用程序,该混合应用程序将QML,JavaScript和C ++代码混合在一起实现。

2 暴露Qt C++的对象或类型给QML

2.1 创建需要暴露给QML的数据类型

#ifndef MYCLASS_H
#define MYCLASS_H
#include <QObject>
#include <QString>
class MyClass : public QObject
{
Q_OBJECT
Q_PROPERTY(QString myString READ myString WRITE setmyString NOTIFY myStringChanged)
public:
explicit MyClass(QObject *parent = 0);
Q_INVOKABLE QString getMyString();
signals:
void myStringChanged();
public slots:
void setmyString(QString aString);
QString myString();
private:
QString m_string;
};
#endif // MYCLASS_H

若你想数据元素中的方法可以被QML直接调用有2种方法:

  • 在函数申明前添加 Q_INVOKABLE 宏。
  • 申明成public slots。
    QML可以直接访问改数据元素的属性,该属性由QPROPERTY所申明。

2.2 暴露已存在的Qt C++对象给QML

//main.cpp
MyClass myObj;
QDeclarativeEngine *engine=viewer.engine();
QDeclarativeContext *context=engine->rootContext();
context->setContextProperty("myObjectExposeByCXProperty", &myObj);
qml中可以直接使用myObjectExposeByCxProperty对象。

//mainpage.qml
...
Button{
...
id:btn1
...
text: qsTr("PROPERTY") 
//此处调用myString为MyClass的QPROPERTY的属性不是方法,所以没有括号。
onClicked: label.text=myObjectExposeByCXProperty.myString;
}

3

参考

1、Qt 5.12学习笔记–QML and C++ 混编概述
2、Overview - QML and C++ Integration
3、QT开发(六十九)——QML与C++混合编程
4、【QML与C++混合编程】用QVariantList传递数组类型成员
5、Qt 5.12学习笔记–特定宏介绍

相关标签: Qt quick