2017.5.8 更新:Record类要用指针,QObject 不能有拷贝函数。
我有一个C++中自定义的ReaderModel,继承自QAbstractListModel类,传递给了QML。
它的me成员是一个Reader指针,Reader有个成员是RecordModel。
通过reader获取的recordModel,在qml中类型是QVariant(RecordModel),我没法把它作为一个ListView的model。
要怎么让它绑定给view呢?
我尝试者把数据拷贝到一个直接传给qml的recordModel,但是当数据之后发生了变化时,视图就不会更新,除非再次拷贝,这样效率不可观。
通过艰难地google查找相关问题,我最后的解决方案是:
取消这个RecordModel成员,用QVariantList来储存所有record。
简单地说就是传递自定义类中的自定义结构体数组。
作为解决方案的代码(如果不需要,完全可以不用ReaderModel,但是要用setContextProperty把reader变量传给qml):
record.h
#ifndef RECORD_H
#define RECORD_H
#include
class Record: public QObject
{
Q_OBJECT
Q_PROPERTY(QString bookId READ bookId WRITE setBookId NOTIFY bookIdChanged)
Q_PROPERTY(int state READ state WRITE setState NOTIFY stateChanged)
public:
Record(const QString &bookId="",int state=0):
bookId_(bookId),state_(state){}
Record(const Record &r){
bookId_ = r.bookId_;
state_ = r.state_;
}
QString bookId() const;
int state() const;
public slots:
void setBookId(const QString &);
void setState(int);
private:
QString bookId_;
int state_;
signals:
void bookIdChanged();
void stateChanged();
};
Q_DECLARE_METATYPE(Record*)//元类型注册
#endif // RECORD_H
reader.h
#ifndef READER_H
#define READER_H
#include
#include
class Reader: public QObject
{
Q_OBJECT
Q_PROPERTY(QString id READ id WRITE setId NOTIFY idChanged)
Q_PROPERTY(QString password RE