QML 與 C++之間的數據傳輸

話不多說,先上代碼:

//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 。

發佈了71 篇原創文章 · 獲贊 50 · 訪問量 19萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章