私の質問は、QObject、qRegisterMetaType、およびプライベート コピー コンストラクターの質問サブクラスを指します。それによると、QVariant が格納できるメタタイプとして 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を使用しています。