QML与C++交互

embedded/2024/10/19 9:42:15/

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/embedded/19011.html

相关文章

区块链技术:NFG元宇宙电商模式

大家好&#xff0c;我是微三云周丽 随着互联网技术的迅猛发展&#xff0c;电子商务行业逐渐崛起为现代经济的重要支柱。而在这一浪潮中&#xff0c;元宇宙电商以其独特的商业模式和巨大的发展潜力&#xff0c;成为行业的新宠。其中&#xff0c;NFG作为元宇宙电商模式的代表&am…

鸿蒙(HarmonyOS)性能优化实战-多线程共享内存

概述 在应用开发中&#xff0c;为了避免主线程阻塞&#xff0c;提高应用性能&#xff0c;需要将一些耗时操作放在子线程中执行。此时&#xff0c;子线程就需要访问主线程中的数据。ArkTS采用了基于消息通信的Actor并发模型&#xff0c;具有内存隔离的特性&#xff0c;所以跨线…

FSMC读取FPGA的FIFO

一、硬件说明 FSMC配置 单片机的代码如下&#xff1a; #define VALUE_ADDRESS_AD1 (__IO uint16_t *)0x60400000while (1){if(!HAL_GPIO_ReadPin(GPIOF, GPIO_PIN_8)) //数据非空{data *(__IO uint16_t *)VALUE_ADDRESS_AD1;data2 *(__IO uint16_t *)VALUE_ADDRESS_AD1…

RabbitMQ(高级)笔记

一、生产者可靠性 &#xff08;1&#xff09;生产者重连&#xff08;不建议使用&#xff09; logging:pattern:dateformat: MM-dd HH:mm:ss:SSSspring:rabbitmq:virtual-host: /hamllport: 5672host: 192.168.92.136username: hmallpassword: 123listener:simple:prefetch: 1c…

TCP关闭连接时的一些思考

TCP协议是TCP/IP栈中最复杂的协议&#xff0c;它最大的优点是传输的可靠性&#xff0c;这通过面向连接、按序传输、超时重传、流量控制等机制保证其传输的可靠性。但这并不是我们今天要讨论的重点&#xff01; TCP通信的过程分别是三个阶段&#xff1a;建立连接、传输数据、关…

【网络安全】HTTP协议 — 基础

专栏文章索引&#xff1a;网络安全 有问题可私聊&#xff1a;QQ&#xff1a;3375119339 目录 学习目标​ 一、万维网的诞生与发展​编辑 1.万维网的诞生与发展 2.HTTP协议诞生与发展 二、网络基础 1.TCP/IP分层传输 1&#xff09;TCP/IP协议 2&#xff09;封装与拆封 …

[Flutter3] Json转dart模型举例

记录一下 Android studio plugin -> FlutterJsonBeanFactory 处理json转dart 模型 案例 json字符串, 一个 response的data返回数据 {"code":1,"msg":"\u64cd\u4f5c\u6210\u529f","data":{"list":{"id":"8…

CasinoRoyale靶机练习实践报告

CasinoRoyale靶机练习实践报告 下载地址: https://drive.google.com/open?id1FYP246L63zShV00wOckAQ5F5XJ4HkZ0Lhttps://download.vulnhub.com/casinoroyale/CasinoRoyale.ovahttps://download.vulnhub.com/casinoroyale/CasinoRoyale.ova.torrent ( Magnet) 1 安装靶机 …