栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

Qml与C++之间的支持的传参类型

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Qml与C++之间的支持的传参类型

直接以代码的形式给出,若还需要测试的类型,可以直接使用模版进行测试

#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))
    }

}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/443836.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号