QML(Qt Meta-Object Language)是Qt框架中的一种声明性语言,用于描述图形界面及其交互行为。它的由来可以追溯到Qt Quick的开发过程。Qt Quick是一种基于QML的用户界面框架,旨在提供一种直观、明确、易于开发和易于维护的方式来创建现代化的用户界面。在开发Qt Quick时,开发人员意识到需要一种声明性语言来描述界面,这就成为了QML的诞生动机。QML的语法借鉴了JavaScript和CSS的语法,使得开发者可以很容易地理解和编写代码。同时,QML的开发方式也符合现代GUI开发的趋势,可以更好地满足用户对于高效、互动和优美的用户界面的需求。
场景
需要在C++类和QML中进行数据传输,传输的数据为QVariantMap类型。
定义C++类
头文件
#include <QObject>
#include <QVariant>
class maphandler : public QObject
{
Q_OBJECT
public:
explicit maphandler (QObject *parent = nullptr);
signals:
void sendMap(QVariant map);
public slots:
void handleMap(QVariant map);
};
实现
#include <QDebug>
maphandler::maphandler (QObject *parent)
: QObject{parent}
{
}
void maphandler::handleMap(QVariant map)
{
QVariantMap vmap = map.toMap();
qDebug() << "Map size: " << vmap.size();
for(auto key: vmap.keys())
{
qDebug() << "Key: " << key << ", Value: " << vmap[key];
}
}
注意这里不要将这个类直接写到main.cpp中,会报错。
main.cpp
int main(int argc, char *argv[])
{
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
#endif
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;
maphandler handler;
engine.rootContext()->setContextProperty("mapHandler", &handler);
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
QVariantMap map;
map["key1"] = "value1";
map["key2"] = "value2";
QVariant vMap = QVariant::fromValue(map);
emit handler.sendMap(vMap);
return app.exec();
}
main.qml
import QtQuick 2.15
import QtQuick.Window 2.15
Window {
width: 640
height: 480
visible: true
title: qsTr("QVariantMap Example")
Connections {
target: mapHandler
onSendMap: {
mapHandler.handleMap(map)
}
}
}
完整例子
gitee
仅作为参考,一起学习和进步。
本文章部分内容使用claude.ai提供的材料