将一对存储在 QObject 子类中
Posted
技术标签:
【中文标题】将一对存储在 QObject 子类中【英文标题】:storing a pair in a QObject subclass 【发布时间】:2012-04-26 07:24:50 【问题描述】:我的问题是指问题Subclass of QObject, qRegisterMetaType, and the private copy constructor。根据它,应该可以将 QObject 的子类注册为 QVariant 可以存储的元类型。我有这个代码:
#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。
【问题讨论】:
【参考方案1】:您可能需要#include <QMetaType>
。
【讨论】:
以上是关于将一对存储在 QObject 子类中的主要内容,如果未能解决你的问题,请参考以下文章
如何将 pimpl 成语与 Qt 和 QObject 的子类一起使用
QObject 子类未检测到 QGuiApplication 事件循环
在 QImage 上调用 QObject::thread()
为啥我能够为 QObject 子类创建复制构造函数并重载赋值运算符?
QGraphicsRectItem中如何实现信号和槽?子类化 qobject 和 qgraphicsrectitem 但出现错误