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 。

  • 6
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 使用C++QML传递视频可以通过以下步骤实现: 第一步,使用C++编写一个视频处理类。该类可以使用第三方库(如FFmpeg)来处理视频文件,如读取、写入、剪切、合并、截图等操作。该类还可以提供视频的基本信息,如分辨率、时长等。 第二步,将视频处理类封装成QML的自定义类型。在C++中使用Q_OBJECT宏和Q_PROPERTY宏定义相关的方法和属性。然后,在QML中注册该类型,以便在QML代码中使用。这样,在QML中可以使用该类型的对象进行视频处理的调用。 第三步,在QML中创建一个视频播放器界面。可以使用Qt Multimedia模块的VideoOutput组件来显示视频。通过设置source属性,将视频处理类中的视频路径传递给VideoOutput以显示视频内容。 第四步,在QML代码中使用视频处理类进行视频操作。可以通过方法调用,如播放视频、暂停视频、截图等。也可以通过属性绑定,如将视频的当前时间与Slider组件的value属性进行绑定,实现视频的拖拽播放。 总之,使用C++QML传递视频可以通过在C++中编写视频处理类,并将其封装为QML的自定义类型,在QML中调用该类型进行视频操作。然后,通过VideoOutput组件将视频展示在QML界面上。这样,就可以实现在QML中进行视频的播放、剪切、合并和截图等功能。 ### 回答2: 将C与QML进行视频传递的方式主要有两种:一种是通过信号与槽机制进行传递,另一种是通过在C端编写视频处理的函数,然后在QML中调用该函数来传递视频。 对于第一种方式,我们可以在C端创建一个信号,该信号可以传递视频的路径或者直接传递视频数据。然后在QML中创建一个槽函数,将该信号与槽函数连接起来。当C端有视频要传递时,可以通过该信号发送视频信息给QML,然后QML会自动调用与之连接的槽函数进行处理。 对于第二种方式,我们可以在C端编写一个处理视频的函数,该函数可以接受视频路径或者视频数据作为输入,并进行相应的处理。然后在QML中调用这个函数,将视频路径或者视频数据传递给该函数。C端通过接收到的视频信息进行处理,可以将处理结果返回给QML进行显示。 无论使用哪种方式进行视频的传递,都需要保证C端的视频处理函数与QML中的函数参数类型和数据传递方式一致,以确保能够正确传递和处理视频。此外,还需要注意在传递视频时,要考虑到视频数据的大小和传输效率,适当进行压缩或者分块传输,以提高传输速度和效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值