QML与C++交互

ops/2025/2/22 0:03:43/

Qt 你好 | 专注于Qt的技术分享平台

QML写界面,业务逻辑使用C++,既能快速的开发界面也能利用C++的强大生态,这是目前比较被认可的方式,那就涉及到QML与C++对象的交互。

我们以登录例子来说明,页面点击登录,将信息传递到c++ http对象进行密码的验证,然后返回登录结果。

一,调用C++中的函数

1,普通C++类

#ifndef HTTPHANDLER_H
#define HTTPHANDLER_H#include <QObject>
class HTTPHandler:public QObject{Q_OBJECT
public:HTTPHandler(QObject* parent=0):QObject(parent){}//登录接口 验证用户名 和密码Q_INVOKABLE bool login(QString name,QString pwd){if(name=="admin"&&pwd=="123"){return true;}else{return false;}}
};
#endif // HTTPHANDLER_H

2,注册C++ 类

main.cpp注册此 C++ 类型,这样QML中就能使用了。

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include "HTTPHandler.h"int main(int argc, char *argv[])
{
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
#endifQGuiApplication app(argc, argv);//注册类型qmlRegisterType<HTTPHandler>("HTTPHandler", 1, 0, "HTTPHandler");QQmlApplicationEngine engine;const QUrl url(QStringLiteral("qrc:/main.qml"));QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,&app, [url](QObject *obj, const QUrl &objUrl) {if (!obj && url == objUrl)QCoreApplication::exit(-1);}, Qt::QueuedConnection);engine.load(url);return app.exec();
}

3,调用C++对象中的函数

只要是C++中 通过Q_INVOKABLE关键词声明的public函数,QML中都能访问。

import QtQuick 2.15
import QtQuick.Controls 1.4
//导入C++ 对象
import HTTPHandler 1.0Rectangle{width: 200height: 200//相当于 实列化一个C++对象HTTPHandler{id:httpHandler}signal loginOk()Row{anchors.centerIn: parentTextField{id:name}TextField{id:pwd}}Button{anchors.bottom: parent.bottomtext: qsTr("登录")onClicked: {//调用C++对象中的函数if(httpHandler.login(name.text,pwd.text)){loginOk()}}}
}

二,响应C++中的信号

上述方式相当于同步的方式调用C++中的函数,还可以异步的响应C++中的信号,相当于QML中的槽与C++中的信号进行绑定。

1,C++类

#ifndef HTTPHANDLER_H
#define HTTPHANDLER_H#include <QObject>
class HTTPHandler:public QObject{Q_OBJECT
public:HTTPHandler(QObject* parent=0):QObject(parent){}Q_INVOKABLE void login(QString name,QString pwd){if(name=="admin"&&pwd=="123"){//验证成功后 激发信号emit loginSuccess();}}signals://登录成功信号void loginSuccess();
};
#endif // HTTPHANDLER_H

2,响应C++信号

import QtQuick 2.15
import QtQuick.Controls 1.4
import HTTPHandler 1.0Rectangle{width: 200height: 200//相当于 实列化一个C++对象HTTPHandler{id:httpHandler//绑定C++信号onLoginSuccess: {loginOk()}}signal loginOk()Row{anchors.centerIn: parentTextField{id:name}TextField{id:pwd}}Button{anchors.bottom: parent.bottomtext: qsTr("登录")onClicked: {//调用C++对象中的函数httpHandler.login(name.text,pwd.text)}}
}

三,绑定C++中的属性

还可以直接在C++定义属性,然后QML绑定此属性,适合实时的传递一些状态数据。

1,C++类

#ifndef HTTPHANDLER_H
#define HTTPHANDLER_H#include <QObject>
class HTTPHandler:public QObject{Q_OBJECT//注册属性Q_PROPERTY(QString status READ getStatus WRITE setStatus NOTIFY statusChanged FINAL)public:HTTPHandler(QObject* parent=0):QObject(parent){}Q_INVOKABLE bool login(QString name,QString pwd){if(name=="admin"&&pwd=="123"){return true;}else{//设置状态信息setStatus("pwd or name error");}}QString getStatus() const;void setStatus(const QString &newStatus);signals:void statusChanged();private://状态信息QString status;
};inline QString HTTPHandler::getStatus() const
{return status;
}inline void HTTPHandler::setStatus(const QString &newStatus)
{if (status == newStatus)return;status = newStatus;emit statusChanged();
}#endif // HTTPHANDLER_H

2,绑定属性

import QtQuick 2.15
import QtQuick.Controls 1.4
import HTTPHandler 1.0Rectangle{width: 200height: 200//相当于 实列化一个C++对象HTTPHandler{id:httpHandler}signal loginOk()Row{anchors.centerIn: parentTextField{id:name}TextField{id:pwd}}//定义一个文本框 直接绑定C++的属性Text {anchors.top: parent.toptext: httpHandler.status}Button{anchors.bottom: parent.bottomtext: qsTr("登录")onClicked: {//调用C++对象中的函数if(httpHandler.login(name.text,pwd.text)){loginOk()}}}
}

3,看下效果

点击登录 ,如果密码或用户名错误会将C++的状态信息,实时的显示到左上角的QML Text控件中。来这里看(QML与C++交互 | Qt 你好)


http://www.ppmy.cn/ops/18821.html

相关文章

uniapp 引用组件后 不起作用 无效果 不显示

根据uniapp官方文档easycom组件规范 只要组件安装在项目的components目录下或uni_modules目录下&#xff0c;并符合components/组件名称/组件名称.(vue|uvue)目录结构&#xff08;注意&#xff1a;当同时存在vue和uvue时&#xff0c;uni-app 项目优先使用 vue 文件&#xff0c;…

鸿蒙小案例-搜索高亮

搜索高亮目前官方也没有可以现成的组件&#xff0c;但是需求来了&#xff0c;怎么办&#xff0c;只能摸索着自己写一个 目前官方API中最接近的应该是 richText组件了&#xff0c;富文本组件&#xff0c;当然可以实现&#xff0c;但是有不少问题 1.大小调整太麻烦&#xff0c;跟…

文字转粤语语音怎么转?文字转语音

文字转粤语语音怎么转&#xff1f;文字转粤语语音的应用&#xff0c;不仅展现了现代科技的魅力&#xff0c;也为我们提供了更加便捷的交流方式。它们将文字转化为粤语发音&#xff0c;让我们能够更直观地感受粤语的韵味和魅力。同时&#xff0c;这些软件还具备高度的可定制性&a…

ElasticSearch集群

我们ES集群主要解决的是这两个问题&#xff1a;海量数据存储问题、单点故障问题 海量数据存储问题&#xff1a;单机的ES&#xff0c;数据存储能力是有上限的 单点故障问题&#xff1a;如果单机上的Elasticsearch节点发生故障&#xff0c;整个系统会停止服务&#xff0c;导致数据…

山东专升本计算机基础 --- Windows 10 操作系统安全

文章目录 Windows 10 操作系统安全1、Windows 10 系统安装的安全2、系统帐户安全3、应用安全策略4、网络安全策略 Windows 10 操作系统安全 1、Windows 10 系统安装的安全 操作系统的安全和安装操作系统的选项密切相关。 选择 NTFS 文件格式分区组件的定制安装 Windows 10 …

常见的css面试题(持续更新,欢迎补充)

目录 1. 什么情况下设置margin会造成margin塌陷? 怎么解决&#xff1f; 2. css的选择器的优先级&#xff0c;怎么判断谁的优先级更高&#xff1f; 总结面试常问的css相关面试题~ 1. 什么情况下设置margin会造成margin塌陷? 怎么解决&#xff1f; 通常遇见margin塌陷&…

linux命令ar使用说明

ar 建立或修改备存文件&#xff0c;或是从备存文件中抽取文件 补充说明 ar命令 是一个建立或修改备存文件&#xff0c;或是从备存文件中抽取文件的工具&#xff0c;ar可让您集合许多文件&#xff0c;成为单一的备存文件。在备存文件中&#xff0c;所有成员文件皆保有原来的属…

MVP+敏捷开发

MVP敏捷开发 1. 什么是敏捷开发&#xff1f; 敏捷开发是一种软件开发方法论&#xff0c;旨在通过迭代、自组织的团队和持续反馈&#xff0c;快速响应需求变化并交付高质量的软件。相较于传统的瀑布模型&#xff0c;敏捷开发强调灵活性、适应性和与客户的紧密合作。敏捷开发方…