将QList <Custom>存储在QVariant中

时间:2019-06-19 11:46:39

标签: c++ qt qvariant

我有一个定义为此的类:

cdataentry.h:

#ifndef CDATAENTRY_H
#define CDATAENTRY_H

#include <QObject>
#include <QString>
#include <QVariant>
#include <QtOpcUa>
#include <QMetaType>

#include <cnodetype.h>
#include <cdatastatus.h>

/**
 * @brief   A class providing data and methods to describe a single OPCUA ua
 *          node in the user input table.
 */
class CDataEntry : public QObject
{
    Q_OBJECT

public:

    CDataEntry(const QString& np, QObject* parent = nullptr);
    ~CDataEntry();

    QString nodePath() const;

private:

    /**
     * @brief   Obsolute path to the node on the MDE server
     */
    const QString m_nodePath;

};

Q_DECLARE_METATYPE(CDataEntry); // to be able to store it in QVariant.

#endif // CDATAENTRY_H

我正在尝试将QList<CDataEntry>对象存储在QVariant中。为此,我提供了Q_DECLARE_METATYPE(CDataEntry); 问题是代码无法编译,我得到的是:

error: no matching function for call to 'QVariant::QVariant(QList<CDataEntry>&)'

我在这里想念什么?

1 个答案:

答案 0 :(得分:1)

您需要将默认构造函数,复制构造函数和复制/赋值运算符添加到QObject子类中。

赞:

CDataEntry& operator=(const CDataEntry&){}
CDataEntry(QObject* parent = nullptr):QObject(parent){}
CDataEntry(const CDataEntry&){}
//...
CDataEntry(const QString& np, QObject* parent = nullptr)

之后,您可以像这样在QVariant中使用它:

    CDataEntry test;
    QList<CDataEntry> list;    
    list.append(test);

    QVariant var = QVariant::fromValue<QList<CDataEntry>>( list );
    auto t = var.value<QList<CDataEntry>>();
    qDebug() << t.first().nodePath();