栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

Qml与C++交互2:Qml调用C++的接口

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Qml与C++交互2:Qml调用C++的接口

Qml与C++交互2:Qml调用C++的接口
    • 1、定义C++类
      • 对C++类的要求
      • C++类代码实现
    • 2、注册C++类
      • 注册实现代码
      • 通过qml引擎的属性注册C++类
    • 3、Qml调用
    • 4、运行

总体思路:在C++ Qt中增加一个类,并在qml引擎加载前实例化。然后通过Qt提供的接口qmlRegisterSingletonInstance 将实例化好的C++对象注册到qml中,然后在qml中使用注册好的名称来调用C++类对象接口。

具体步骤如下:

1、定义C++类 对C++类的要求

即C++类及其成员函数需要满足如下需求后才能别qml所识别和调用:

  • 类必须从QObject或QObject的派生类继承

  • 使用Q_OBJECT宏

  • 普通成员函数必须使用Q_INVOKABLE宏进行前置声明。信号、槽及QT属性不需要增加这个声明,也可以被qml调用。

C++类代码实现
class MyClass : public QObject {
    Q_OBJECT
public:
    MyClass(QString info) : m_info(info) {}

    Q_INVOKABLE QString printInfo();

private:
    QString m_info;
};

QString MyClass::printInfo()
{
    qDebug()<<"info: "< 
2、注册C++类 

方法一:使用Qt提供的接口qmlRegisterSingletonInstance 将实例化好的C++对象注册到qml中,注意需要在qml引擎加载前注册。

如下是qmlRegisterSingletonInstance 接口的说明:

int qmlRegisterSingletonInstance(
	const char *uri, 		// 导出的名称,qml中使用import url来引用
	int versionMajor, 		// 主版本号
	int versionMinor, 		// 小版本号
	const char *typeName, 	// qml中使用此名称作为C++的对象来使用
	QObject *cppObject		// C++类的实例指针
)
注册实现代码
MyClass myInfo(QString("myclss test"));

qmlRegisterSingletonInstance("qml_qt_com.myclass", 1, 0, "MyclassApi", &myInfo);
通过qml引擎的属性注册C++类

方法二:使用qml引擎提供的属性接口注册,如下:

engine.rootContext()->setContextProperty("MyclassApi", &myInfo);

MyclassApi就成为了QML中的全局变量,你可以直接使用它内部的各种元数据(信号、槽、属性、枚举类型等等)

3、Qml调用
  • qml中需要导入注册的C++实例类名称
  • 使用注册的typeName作为C++对象来调用成员函数

实现如下:

import qml_qt_com.myclass 1.0 // 导入模块,使用qml引擎的属性注册时不需要如此导入

Button {
	text: "Quit";
	objectName: "quitButton";

	Layout.leftMargin: 10

	onClicked: {
		// 调用C++接口
		console.log("clicked info: "+MyclassApi.printInfo())
	}
}
4、运行

点击button后,输出如下数据:

info:  "myclss test"			// c++输出
qml: clicked info: myclss test	// qml输出

完整实现可以微信搜索公众号:“上官宏竹”,或者扫下面的二维码,关注并回复:“qml_2”,获取资源链接。有任何疑问也可以公众号里留言咨询。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/931939.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号