【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();
}
相关推荐
不想写代码的星星4 小时前
C++继承、组合、聚合:选错了是屎山,选对了是神器
c++
不想写代码的星星1 天前
std::function 详解:用法、原理与现代 C++ 最佳实践
c++
Felix_One2 天前
Qt 串口通信避坑指南:QSerialPort 的 5 个常见问题
qt
樱木Plus3 天前
深拷贝(Deep Copy)和浅拷贝(Shallow Copy)
c++
blasit5 天前
笔记:Qt C++建立子线程做一个socket TCP常连接通信
c++·qt·tcp/ip
肆忆_6 天前
# 用 5 个问题学懂 C++ 虚函数(入门级)
c++
不想写代码的星星6 天前
虚函数表:C++ 多态背后的那个男人
c++
端平入洛8 天前
delete又未完全delete
c++
端平入洛9 天前
auto有时不auto
c++
哇哈哈202110 天前
信号量和信号
linux·c++