話不多說,先上代碼:
//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 。