话不多说,先上代码:
//main.cpp
#include <QGuiApplication>
#include <qqmlapplicationengine>
#include <qtqml>
#include <QTextCodec>
#include <QQmlContext>
#include <QQuickView>
#include "TransObj.h"
#include <thread>
#include <Windows.h>
#include <iostream>
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
qmlRegisterType<Gemini>("an.qml.TransObj", 1, 0, "TransObj");
QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("Test.qml")));
return app.exec();
}
//TransObj.h
#pragma once
#include <qobject>
#include <qdebug>
class Gemini : public QObject
{
Q_OBJECT
public:
Q_INVOKABLE void getValFromQml(int v) {
qDebug() << "value from qml is :" << v;
emit valueFromCpp(456);
}
signals:
void valueFromCpp(int val);
};
//Test.qml
import QtQuick 2.6
import QtQuick.Window 2.2
import QtQuick.Controls 2.1
import QtQuick.Controls.Styles 1.2
import QtQuick.Dialogs 1.2
import an.qml.TransObj 1.0
//主窗体
Window {
id:window;
visible: true;
width: 600;
height: 480;
minimumWidth: 480;
minimumHeight: 380;
TransObj{
id:transobj;
onValueFromCpp:{
console.log("value from cpp :" + val);
}
}
Button {
id: test;
text: "test";
anchors.left:parent.left;
anchors.bottom: parent.bottom;
onClicked: {
transobj.getValFromQml(123);
}
}
}
main函数中注册一个中间类TranObj用于数据的传输,没有其他操作。
一.qml传数据到c++
1.TranObj.h中定义一个开放给qml调用的函数 Q_INVOKABLE void getValFromQml(var v){}
2.qml中 通过(1)import ,(2) 定义TransObj{ id:transobj;}得到变量transobj.
3.通过变量直接调用getValFromQml(123),把值123传入c++
二.c++传数据到qml
1.TranObj.h中定义信号valueFromCpp(var v)
2.qml中 通过定义TransObj{ id:transobj;}时直接链接此信号。
3.链接信号的方式是on+首字母大写函数名,onValueFromCpp:{},在该函数中可以直接使用v的值,变量名为.h中信号函数中的参数名。
4.通过emit valueFromCpp(456) 把值456传入qml 。