【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();
}
相关推荐
玖玥拾2 小时前
C/C++ 数据结构(七)栈、容器适配器
c语言·数据结构·c++··容器适配器
桥田智能3 小时前
桥田智能 QT-650S:面向白车身焊装的 800kg 重载快换解决方案
开发语言·qt·系统架构
один but you3 小时前
constexpr函数
c++
凡人叶枫4 小时前
Effective C++ 条款41:了解隐式接口和编译期多态
java·开发语言·c++·effective c++
凡人叶枫4 小时前
Effective C++ 条款42:了解 typename 的双重意义
java·linux·服务器·c++
小胖xiaopangss4 小时前
BRpc使用
c++·rpc
-森屿安年-5 小时前
63. 不同路径 II
c++·算法·动态规划
chase_my_dream5 小时前
Cartographer详细讲解
c++·人工智能·自动驾驶
森G5 小时前
75、服务器源码解析---------云视频服务项目
linux·服务器·网络·c++·qt
碧海蓝天20225 小时前
C++法则24:在标准 C++ 中,没有任何可移植的方式判断指针 T* pt 指向的内存位置是否已经 构造了对象,程序员必须手动跟踪哪些元素已构造。
java·开发语言·c++