【QML】QML与C++混合编程,结构体参数互相传递

1. 方法1:

C++结构体的每个成员都声明成QML的属性。QML中就可以直接以属性的方式读写。

.h文件

c 复制代码
typedef struct {
    QString startRecord;
    QString fanSpeed;
    QString scrBrightness;
    QString printerType;
} ManuSet_t;

class ManuSet : public QObject
{
    Q_OBJECT

    Q_PROPERTY(QString startRecord READ startRecord WRITE setStartRecord NOTIFY startRecordChanged)
    Q_PROPERTY(QString fanSpeed READ fanSpeed WRITE setFanSpeed NOTIFY fanSpeedChanged)
    Q_PROPERTY(QString scrBrightness READ scrBrightness WRITE setScrBrightness NOTIFY scrBrightnessChanged)
    Q_PROPERTY(QString printerType READ printerType WRITE setPrinterType NOTIFY printerTypeChanged)

public:
    QString startRecord();
    void setStartRecord(const QString &para);

    QString fanSpeed();
    void setFanSpeed(const QString &para);

    QString scrBrightness();
    void setScrBrightness(const QString &para);

    QString printerType();
    void setPrinterType(const QString &para);
    
signals:
    void startRecordChanged();
    void fanSpeedChanged();
    void scrBrightnessChanged();
    void printerTypeChanged();
}

.cpp文件中实现

main.cpp中注册类型

c 复制代码
qmlRegisterType<ManuSet>("com.custom", 1, 0, "ManuSet");

qml文件中直接使用

c 复制代码
import com.custom 1.0

ManuSet{
	id: _ms
	startRecord: "test"
}

2. 方法2:

QVariantMap 的方式。

2.1 C++发送给QML

结构体

c 复制代码
struct Info
{
    float tmp;              // 温度
    int day_code;           // 白天天气代码
    QString day_text;       // 白天天气情况
    int night_code;         // 夜间天气代码
    QString night_text;     // 夜间天气情况
};

C++代码

c 复制代码
//在minxCppDemo类中声明和定义
QVariantMap MixCppDemo::getInfo(Info *m_Info)
{
    QVariantMap map;
    map.clear();

    map.insert("tmp", m_Info->tmp);
    map.insert("day_code", m_Info->day_code);
    map.insert("day_text", m_Info->day_text);
    map.insert("night_code", m_Info->night_code);
    map.insert("night_text", m_Info->night_text);

    return map;
}

QML代码

c 复制代码
MixCppDemo {
	id: minxCppDemo
}

Component.onCompleted: {
	var textString = ''
	// 显示天气信息
	var currentInfo = minxCppDemo.getInfo()
	textString += '温度:' 	     + currentInfo.tmp.toString() + '\n';
	textString += '白天天气代码: ' + currentInfo.day_code.toString() + '\n'
	textString += '白天天气情况: ' + currentInfo.day_text + '\n'
	textString += '夜间天气代码: ' + currentInfo.night_code.toString() + '\n'
	textString += '夜间天气情况: ' + currentInfo.night_text + '\n\n'
	
	console.log(textString);
}

2.2 QML发送给C++

结构体

c 复制代码
struct Info
{
    float tmp;              // 温度
    int day_code;           // 白天天气代码
    QString day_text;       // 白天天气情况
    int night_code;         // 夜间天气代码
    QString night_text;     // 夜间天气情况
};

QML代码

c 复制代码
MixCppDemo {
	id: minxCppDemo
}

function test(){
	var map = {};
	
	map.tmp = 25.5;
	//map["tmp"] = 25.5; //与上面的代码效果一样
	map.day_code = 1;
	map.day_text = "2";
	map.night_code = 3;
	map.night_text  = "4";

	minxCppDemo.setInfo(map);
}

C++代码

c 复制代码
Info m_Info;

void MixCppDemo::setInfo(const QVariantMap map)
{
	m_Info.tmp = map.value("tmp").toString();
	//...

    qDebug() << map.value("tmp").toString();
    qDebug() << map.value("day_code").toString();
    qDebug() << map.value("day_text").toString();
    qDebug() << map.value("night_code").toString();
    qDebug() << map.value("night_text").toString();
}
相关推荐
倒头就睡的小比特1 天前
算法竞赛C++常用的STL
c++·算法
weilx12341 天前
C++笔记-文件IO-<fcntl.h>
c++
Smileyqp沛沛1 天前
前端?C++ ?较大差异基础罗列
c++·基础·前端转c++
C语言小火车1 天前
C/C++ 为什么需要编译器?
开发语言·c++
旖旎夜光1 天前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
吞下星星的少年·-·1 天前
C++ 萌新语法入门篇
c++·算法比赛
霍霍的袁1 天前
【C++】map 和 set 的使用 | 从用法到底层
开发语言·c++·学习·visual studio
another heaven1 天前
【算法/C++ MD5算法能否逆解码?原理、C++实现与同类哈希算法对比】
c++·算法·哈希算法
程序猿编码1 天前
告别改源码适配模型:纯 C++ 可配置 LLM 推理引擎,全格式全结构兼容
c++·大模型·llm·推理引擎
此生决int1 天前
深入理解C++系列(20)——C++11(下)
开发语言·c++