0

私の質問は、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を使用しています。

4

1 に答える 1

3

おそらくする必要があり#include <QMetaType>ます。

于 2012-04-26T07:48:12.810 に答える