【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();
}
相关推荐
感哥5 分钟前
C++ std::string
c++
感哥16 小时前
C++ 面向对象
c++
沐怡旸18 小时前
【底层机制】std::shared_ptr解决的痛点?是什么?如何实现?如何正确用?
c++·面试
感哥1 天前
C++ STL 常用算法
c++
saltymilk1 天前
C++ 模板参数推导问题小记(模板类的模板构造函数)
c++·模板元编程
感哥1 天前
C++ lambda 匿名函数
c++
沐怡旸2 天前
【底层机制】std::unique_ptr 解决的痛点?是什么?如何实现?怎么正确使用?
c++·面试
感哥2 天前
C++ 内存管理
c++
博笙困了2 天前
AcWing学习——双指针算法
c++·算法
感哥2 天前
C++ 指针和引用
c++