Qt 接收c++;QML-QList中带有参数的信号<;QPair>; 我试图从QML中的C++信号中找到QListar,我只得到QVariant(RealDistListor)或QVariant(QLIST)。尝试使用不同的受支持序列类型,它们工作得很好(QList)。如果有人能帮助我理解我的错误,我将不胜感激。问候

Qt 接收c++;QML-QList中带有参数的信号<;QPair>; 我试图从QML中的C++信号中找到QListar,我只得到QVariant(RealDistListor)或QVariant(QLIST)。尝试使用不同的受支持序列类型,它们工作得很好(QList)。如果有人能帮助我理解我的错误,我将不胜感激。问候,qt,qml,qt5,signals-slots,qt-signals,Qt,Qml,Qt5,Signals Slots,Qt Signals,jsonreaderasync.h typedef QPair<qreal,qreal>Record; typedef QList<Record>RecordList; class JsonReaderAsync : public QObject { Q_OBJECT public: explicit JsonReaderAsync(QObject *parent = nullptr); Q_INVOKABLE void start(const Q

jsonreaderasync.h

typedef QPair<qreal,qreal>Record;
typedef QList<Record>RecordList;
class JsonReaderAsync : public QObject
{
    Q_OBJECT
public:
    explicit JsonReaderAsync(QObject *parent = nullptr);
    Q_INVOKABLE void start(const QString& fileName);

signals:
    void started();
    //void finished(QList<qreal> record);
    void finished(RecordList record);
    //void finished(QList<Record> record); 

};
#include <QObject>
#include <QVariant>

class Record : public QPair<qreal, qreal> {
    Q_GADGET

    Q_PROPERTY(qreal first  MEMBER first  CONSTANT FINAL)
    Q_PROPERTY(qreal second MEMBER second CONSTANT FINAL)

public:

    Record() = default;
    Record(qreal a, qreal b) : QPair<qreal, qreal>(a, b) {}
};

class JsonReaderAsync : public QObject
{
    Q_OBJECT
public:
    explicit JsonReaderAsync(QObject *parent = nullptr);
    Q_INVOKABLE void start(const QString& fileName);

signals:
    void started();

    void finished(QVariantList record);  // RecordList
};

< QML >中,元类型系统是QML引擎从QML环境访问C++结构的唯一途径。 也就是说,只有具有
Q_属性
声明的对象和自定义对象才能从QML环境访问

以下是我推荐的(最简单的)修改:

jsonreaderasync.h

typedef QPair<qreal,qreal>Record;
typedef QList<Record>RecordList;
class JsonReaderAsync : public QObject
{
    Q_OBJECT
public:
    explicit JsonReaderAsync(QObject *parent = nullptr);
    Q_INVOKABLE void start(const QString& fileName);

signals:
    void started();
    //void finished(QList<qreal> record);
    void finished(RecordList record);
    //void finished(QList<Record> record); 

};
#include <QObject>
#include <QVariant>

class Record : public QPair<qreal, qreal> {
    Q_GADGET

    Q_PROPERTY(qreal first  MEMBER first  CONSTANT FINAL)
    Q_PROPERTY(qreal second MEMBER second CONSTANT FINAL)

public:

    Record() = default;
    Record(qreal a, qreal b) : QPair<qreal, qreal>(a, b) {}
};

class JsonReaderAsync : public QObject
{
    Q_OBJECT
public:
    explicit JsonReaderAsync(QObject *parent = nullptr);
    Q_INVOKABLE void start(const QString& fileName);

signals:
    void started();

    void finished(QVariantList record);  // RecordList
};
#包括
#包括
课程记录:公共QPair{
Q_小工具
Q_属性(qreal第一成员第一常数最终值)
Q_属性(qreal第二个成员第二个常量最终值)
公众:
记录()=默认值;
记录(qreal a,qreal b):QPair(a,b){}
};
类JsonReaderAsync:公共QObject
{
Q_对象
公众:
显式JsonReaderAsync(QObject*parent=nullptr);
Q_可调用的void start(常量QString和文件名);
信号:
void start();
作废完成(QVariantList记录);//记录列表
};
jsonreaderasync.cpp

#include <QDebug>

#include "jsonreaderasync.h"

Q_DECLARE_METATYPE(Record)
Q_DECLARE_METATYPE(RecordList)
//Q_DECLARE_METATYPE(QList<Record>)


JsonReaderAsync::JsonReaderAsync(QObject *parent) : QObject(parent)
{
    qRegisterMetaType<Record>("Record");
    qRegisterMetaType<RecordList>("RecordList"); // qml prints QVariant(RecordList, )
    //qRegisterMetaType<QList<Record>>("QList<Record>"); //qml prints QVariant(QList<Record>, )

}

void JsonReaderAsync::start(const QString &fileName)
{

    QList<Record> record;
    record.append(qMakePair(1,1));
    record.append(qMakePair(1,2));
    record.append(qMakePair(1,3));

//    QList<qreal> foo;
//    foo.append(1);
//    foo.append(1);
//    foo.append(1);

    emit finished(record);

}
#include <QDebug>

#include "jsonreaderasync.h"

JsonReaderAsync::JsonReaderAsync(QObject *parent) : QObject(parent)
{
    qRegisterMetaType<Record>("Record");
}

void JsonReaderAsync::start(const QString &fileName)
{
    QVariantList record;
    record.append(QVariant::fromValue(Record(1,1)));
    record.append(QVariant::fromValue(Record(1,2)));
    record.append(QVariant::fromValue(Record(1,3)));

    emit finished(record);
}
#包括
#包括“jsonreaderasync.h”
JsonReaderAsync::JsonReaderAsync(QObject*parent):QObject(parent)
{
qRegisterMetaType(“记录”);
}
void JsonReaderAsync::start(常量QString和文件名)
{
QVariantList记录;
append(QVariant::fromValue(记录(1,1));
append(QVariant::fromValue(记录(1,2));
append(QVariant::fromValue(记录(1,3));
发射完成(记录);
}
现在,您可以从QML访问记录:

onFinished: {
    for (var i = 0; i < record.length; ++i)
        console.log(record[i].first + "->" + record[i].second);
}
onFinished:{
对于(变量i=0;i”+记录[i].second);
}

<>注意,C++对象与QML对象之间的转换确实会产生一定的开销,如果这些代码对性能敏感,请考虑使用.< /P> < P> QML,Meta类型系统是QML引擎从QML环境访问C++结构的唯一途径。 也就是说,只有具有
Q_属性
声明的对象和自定义对象才能从QML环境访问

以下是我推荐的(最简单的)修改:

jsonreaderasync.h

typedef QPair<qreal,qreal>Record;
typedef QList<Record>RecordList;
class JsonReaderAsync : public QObject
{
    Q_OBJECT
public:
    explicit JsonReaderAsync(QObject *parent = nullptr);
    Q_INVOKABLE void start(const QString& fileName);

signals:
    void started();
    //void finished(QList<qreal> record);
    void finished(RecordList record);
    //void finished(QList<Record> record); 

};
#include <QObject>
#include <QVariant>

class Record : public QPair<qreal, qreal> {
    Q_GADGET

    Q_PROPERTY(qreal first  MEMBER first  CONSTANT FINAL)
    Q_PROPERTY(qreal second MEMBER second CONSTANT FINAL)

public:

    Record() = default;
    Record(qreal a, qreal b) : QPair<qreal, qreal>(a, b) {}
};

class JsonReaderAsync : public QObject
{
    Q_OBJECT
public:
    explicit JsonReaderAsync(QObject *parent = nullptr);
    Q_INVOKABLE void start(const QString& fileName);

signals:
    void started();

    void finished(QVariantList record);  // RecordList
};
#包括
#包括
课程记录:公共QPair{
Q_小工具
Q_属性(qreal第一成员第一常数最终值)
Q_属性(qreal第二个成员第二个常量最终值)
公众:
记录()=默认值;
记录(qreal a,qreal b):QPair(a,b){}
};
类JsonReaderAsync:公共QObject
{
Q_对象
公众:
显式JsonReaderAsync(QObject*parent=nullptr);
Q_可调用的void start(常量QString和文件名);
信号:
void start();
作废完成(QVariantList记录);//记录列表
};
jsonreaderasync.cpp

#include <QDebug>

#include "jsonreaderasync.h"

Q_DECLARE_METATYPE(Record)
Q_DECLARE_METATYPE(RecordList)
//Q_DECLARE_METATYPE(QList<Record>)


JsonReaderAsync::JsonReaderAsync(QObject *parent) : QObject(parent)
{
    qRegisterMetaType<Record>("Record");
    qRegisterMetaType<RecordList>("RecordList"); // qml prints QVariant(RecordList, )
    //qRegisterMetaType<QList<Record>>("QList<Record>"); //qml prints QVariant(QList<Record>, )

}

void JsonReaderAsync::start(const QString &fileName)
{

    QList<Record> record;
    record.append(qMakePair(1,1));
    record.append(qMakePair(1,2));
    record.append(qMakePair(1,3));

//    QList<qreal> foo;
//    foo.append(1);
//    foo.append(1);
//    foo.append(1);

    emit finished(record);

}
#include <QDebug>

#include "jsonreaderasync.h"

JsonReaderAsync::JsonReaderAsync(QObject *parent) : QObject(parent)
{
    qRegisterMetaType<Record>("Record");
}

void JsonReaderAsync::start(const QString &fileName)
{
    QVariantList record;
    record.append(QVariant::fromValue(Record(1,1)));
    record.append(QVariant::fromValue(Record(1,2)));
    record.append(QVariant::fromValue(Record(1,3)));

    emit finished(record);
}
#包括
#包括“jsonreaderasync.h”
JsonReaderAsync::JsonReaderAsync(QObject*parent):QObject(parent)
{
qRegisterMetaType(“记录”);
}
void JsonReaderAsync::start(常量QString和文件名)
{
QVariantList记录;
append(QVariant::fromValue(记录(1,1));
append(QVariant::fromValue(记录(1,2));
append(QVariant::fromValue(记录(1,3));
发射完成(记录);
}
现在,您可以从QML访问记录:

onFinished: {
    for (var i = 0; i < record.length; ++i)
        console.log(record[i].first + "->" + record[i].second);
}
onFinished:{
对于(变量i=0;i”+记录[i].second);
}

注意,C++对象和QML对象之间的转换确实会产生一点开销,如果这些代码对性能敏感,请考虑使用.< /P> < P>。当@ GPeta解决方案工作时,我希望QML支持的对更灵活。我尝试使用模板,但QGoGoGET不支持它。可能有一个智能包装器。(模板+QVariant)解决方案,我想……尽管如此,以下是我解决问题的方法:

class PairQml {
    Q_GADGET

    Q_PROPERTY(QVariant first MEMBER first CONSTANT FINAL)
    Q_PROPERTY(QVariant second MEMBER second CONSTANT FINAL)

public:
    PairQml() = default;
    PairQml(QVariant f, QVariant s): first(f), second(s) {}

    QVariant first;
    QVariant second;
};

别忘了注册:
qRegisterMetaType(“PairQml”);

虽然@GPBeta解决方案有效,但我希望Qml支持的对具有更大的灵活性。我尝试使用模板,但QU GADGET不支持它。可能有一个智能包装器(模板+QVariant)解决方案,我想……尽管如此,以下是我解决问题的方法:

class PairQml {
    Q_GADGET

    Q_PROPERTY(QVariant first MEMBER first CONSTANT FINAL)
    Q_PROPERTY(QVariant second MEMBER second CONSTANT FINAL)

public:
    PairQml() = default;
    PairQml(QVariant f, QVariant s): first(f), second(s) {}

    QVariant first;
    QVariant second;
};
别忘了注册:
qRegisterMetaType(“PairQml”);