2012-04-26 14 views
0

質問は質問Subclass of QObject, qRegisterMetaType, and the private copy constructorを参照しています。それによると、QVariantが格納できるメタタイプとしてQObjectのサブクラスを登録することが可能でなければなりません。私はこのコードを持っている:QObjectサブクラスにペアを格納する

#ifndef MODELROWREFERENCE_HPP 
# define MODELROWREFERENCE_HPP 

#include <QObject> 

#include <QDataStream> 

class ModelRowReference : 
    public QObject 
{ 
    Q_OBJECT 

    Q_PROPERTY(QObject* model READ model WRITE setModel) 
    Q_PROPERTY(int row READ row WRITE setRow) 

public: 
    ModelRowReference(QObject* = 0); 
    ModelRowReference(QObject*, int, QObject* = 0); 

    ModelRowReference(ModelRowReference const&); 

    QObject* model() const; 
    void setModel(QObject*); 

    int row() const; 
    void setRow(int); 

private: 
    QObject* model_; 
    int row_; 
}; 

Q_DECLARE_METATYPE(ModelRowReference) 

////////////////////////////////////////////////////////////////////////////// 
inline ModelRowReference::ModelRowReference(QObject* parent) : 
    QObject(parent), 
    model_(0) 
{ 
} 

////////////////////////////////////////////////////////////////////////////// 
inline ModelRowReference::ModelRowReference(QObject* m, int r, 
    QObject* parent) : 
    QObject(parent), 
    model_(m), 
    row_(r) 
{ 
} 

////////////////////////////////////////////////////////////////////////////// 
inline ModelRowReference::ModelRowReference(ModelRowReference const& other) : 
    QObject(other.parent()), 
    model_(other.model_), 
    row_(other.row_) 
{ 
} 

////////////////////////////////////////////////////////////////////////////// 
inline QObject* ModelRowReference::model() const 
{ 
    return model_; 
} 

////////////////////////////////////////////////////////////////////////////// 
inline void ModelRowReference::setModel(QObject* m) 
{ 
    model_ = m; 
} 

////////////////////////////////////////////////////////////////////////////// 
inline int ModelRowReference::row() const 
{ 
    return row_; 
} 

////////////////////////////////////////////////////////////////////////////// 
inline void ModelRowReference::setRow(int r) 
{ 
    row_ = r; 
} 

////////////////////////////////////////////////////////////////////////////// 
inline QDataStream& operator<<(QDataStream& out, ModelRowReference const& p) 
{ 
    QObject* model(p.model()); 

    out << QByteArray(reinterpret_cast<char const*>(&model), sizeof(model)); 
    out << p.row(); 

    return out; 
} 

////////////////////////////////////////////////////////////////////////////// 
inline QDataStream& operator>>(QDataStream& in, ModelRowReference& r) 
{ 
    QByteArray a; 

    in >> a; 

    r.setModel(*reinterpret_cast<QObject**>(a.data())); 

    int row; 

    in >> row; 

    r.setRow(row); 

    return in; 
} 

#endif // MODELROWREFERENCE_HPP 

をしかし、それもコンパイルされません。

modelrowreference.hpp:36:1: error: expected constructor, destructor, or type conversion before 'inline' 

が、これは間違って行うことができること、答えである、または私が何か間違ったことをやっていますか?私はポインタの方法(ModelRowReferenceを登録する*)を行ったかもしれないが、誰がその後、ポインタを削除するつもりですか? ModelRowReferenceの数千のインスタンスが作成され、モデルオブジェクトの存続期間はプログラムの終わりまで拡張されます。

私が達成しようとしているのは、ペア(モデル、行)をQMLプログラムに公開することです。私がQPair経由で行うと、QMLプログラムはそのペアのメンバーにアクセスすることができません。

私はQt4.8を使用しています。

答えて

3

おそらく#include <QMetaType>が必要です。

+0

信じられないほどです! – user1095108

関連する問題