直接以代码的形式给出,若还需要测试的类型,可以直接使用模版进行测试
#ifndef TRANSFERPARA_H #define TRANSFERPARA_H #include#include #include typedef struct dataInfo { cv::Mat mat; QVariant var; QImage image; QString str; qreal number; int integer; int type = 1; // type 0 - QImage 1 - QString 2 - qreal 3 - int } DataInfo; Q_DECLARE_metaTYPE(DataInfo) // 标记自定义类型 // 测试传参的类,qml传入信息并返回相同类型信息,看qml端是否支持接收 class TransferPara : public QObject { Q_OBJECT public: explicit TransferPara(QObject *parent = nullptr) : QObject(parent){}; // 测试传入QStringList,并返回QStringList,若qml端传递的number类型数组在这里会被强制转换为QString类型 Q_INVOKABLE QStringList testQStringList(QStringList list) { return list; } // 测试传入qreal、double、float、int类型均可正确返回 Q_INVOKABLE float testsingleType(float para) { return para; } // 测试传入qreal、double、float、int类型QVector,仅QVector 不支持传值和返回 Q_INVOKABLE QVector testVectorType(QVector vec) { return vec;} // 测试传入qreal、double、float、int类型QList,仅QList 不支持传值和返回 Q_INVOKABLE QList testListType(QList list) { return list;} // 测试传入QImage,返回QImage。正常传参 Q_INVOKABLE QImage testImage() { qDebug()<<"testImage nonpara"; return QImage(""); } Q_INVOKABLE void testImage(QImage image) {qDebug()<<"testImage para"; qDebug()< ,正常传值 Q_INVOKABLE QVector testImageVec() { qDebug()<<"testImageVec nonpara"; return QVector (10, QImage()); } Q_INVOKABLE void testImageVec(QVector vec) { qDebug()<<"testImageVec para";qDebug()< ,正常传值 Q_INVOKABLE QList testImageList() { qDebug()<<"testImageList nonpara"; return QList {QImage(), QImage()}; } Q_INVOKABLE void testImageList(QList list) { qDebug()<<"testImageList para";qDebug()< ,正常传值 Q_INVOKABLE QVector testQVariantVec() { QVector vec; vec.push_back(QImage(":/images/1.png")); vec.push_back(QString("vervrvreverver")); vec.push_back(1000); return vec; } Q_INVOKABLE void testQVariantVec(QVector vec) { QImage image = vec.at(0).value (); image.save("test.jpg"); QString str = vec.at(1).toString(); qreal number = vec.at(2).toReal(); qDebug()<<"image.size():"< testCustomTypeVec() { QImage image(":/images/1.png"); QString str("cewccccccccc"); qreal number = 100.222; int integer = 500; int type = 1; QVector vec; cv::Mat mat = imread("1.jpg"); vec.push_back({mat, 10,image, str, number, integer, type}); vec.push_back({mat, 10,image, str, number, integer, type}); vec.push_back({mat, 10,image, str, number, integer, type}); return vec; } Q_INVOKABLE void testCustomTypeVec(QVector vec) { DataInfo p0 = vec.at(0); DataInfo p1 = vec.at(1); DataInfo p2 = vec.at(2); cv::Mat mat = p0.mat.clone(); imshow("mat", mat); waitKey(0); qDebug()< #include#include #include "transferpara.h" int main(int argc, char *argv[]) { QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); QGuiApplication app(argc, argv); QQmlApplicationEngine engine; // 在engine变量之后注册 类型以供qml访问 qmlRegisterType ("TransferPara", 1, 0, "TransferPara"); // 注册自定义类型到元对象系统中,可以让 QmetaType 查询到类型,也可以让 QVariant 识别到 qRegistermetaType ("DataInfo"); const QUrl url(QStringLiteral("qrc:/main.qml")); QObject::connect(&engine, &QQmlApplicationEngine::objectCreated, &app, [url](QObject *obj, const QUrl &objUrl) { if (!obj && url == objUrl) QCoreApplication::exit(-1); }, Qt::QueuedConnection); engine.load(url); return app.exec(); } import QtQuick 2.12 import QtQuick.Window 2.12 import TransferPara 1.0 Window { visible: true width: 640 height: 480 title: qsTr("Hello World") TransferPara {id: test} Component.onCompleted: { // 测试 QStringList传参 var array = [10.55,2,3,4,5,6.55] var ret = test.testListType(array) var tmp = test.testCustomTypeVec() test.testCustomTypeVec(tmp); console.log(JSON.stringify(ret)) } }



