QAbstractListModelからカスタムQObjectサブクラスを返してQML ListViewで使用するにはどうすればよいですか?QAbstractListModelからカスタムQObjectサブクラスを返してListViewで使用する
オブジェクトを表示役割として返そうとしましたが、プロパティにアクセスするためにqml display.propertyを使用しましたが、うまくいきましたが、qmlのqobjectとしてmodelを使用し、model.property 。私は何かを逃していますか?
もう1つの質問:オブジェクトをListViewレベルで公開し、それを使ってマスタービューの詳細のような他のパネルを設定すると、デリゲートのバリアントプロパティとしてロールが表示されますonCurrentItemChanged信号でリストビューレベルに設定するのは正しい方法ですか?
これは私がしようとしていますが、それは動作しないものです:
#ifndef NOTE_H
#define NOTE_H
#include <QObject>
class Note : public QObject
{
Q_OBJECT
Q_PROPERTY(QString note READ note WRITE setNote NOTIFY noteChanged)
Q_PROPERTY(int id READ id WRITE setId NOTIFY idChanged)
QString m_note;
int m_id;
public:
explicit Note(QObject *parent = 0);
Note(QString note, int id, QObject *parent = 0);
QString note() const
{
return m_note;
}
int id() const
{
return m_id;
}
signals:
void noteChanged(QString note);
void idChanged(int id);
public slots:
void setNote(QString note)
{
if (m_note == note)
return;
m_note = note;
emit noteChanged(note);
}
void setId(int id)
{
if (m_id == id)
return;
m_id = id;
emit idChanged(id);
}
};
#endif // NOTE_H
ビューモデル:ビューモデルの
#ifndef NOTESVIEWMODEL_H
#define NOTESVIEWMODEL_H
#include <QAbstractListModel>
#include <QVector>
#include "note.h"
class NotesViewModel : public QAbstractListModel
{
Q_OBJECT
QVector<Note*> notes;
public:
NotesViewModel();
QVariant data(const QModelIndex &index, int role) const override;
int rowCount(const QModelIndex &parent) const override;
};
#endif // NOTESVIEWMODEL_H
が実装:
NotesViewModel::NotesViewModel()
{
notes.append(new Note("note 1", 1));
notes.append(new Note("note 2", 2));
notes.append(new Note("note 3", 3));
notes.append(new Note("note 4", 4));
notes.append(new Note("note 5", 5));
}
QVariant NotesViewModel::data(const QModelIndex &index, int role) const
{
qDebug() << "fetching data : " << index.row();
if(!index.isValid()) return QVariant();
if(index.row() >= 5) return QVariant();
if(role == Qt::DisplayRole)
return QVariant::fromValue(notes[index.row()]);
return QVariant();
}
int NotesViewModel::rowCount(const QModelIndex &parent) const
{
Q_UNUSED(parent)
return notes.count();
}
一般に、モデルは内部オブジェクトを公開するのではなく、表示ロールなどのようなものだけを表示できますが、カスタムロールを追加してデータ(QVariant)を使って返すこともできます。識別子のように、オブジェクトを別の場所に取得します。 – Hayt
あなたが言っていることは正しいと私はあなたに同意しますが、詳細ビューがマスタービューの代理人の一部ではないmasterdetailビューのような状況では、それは非常に難しいです。 –
それ以上の詳細なしで助言するのは一種難しいです。ノートとIDのどこかに地図を置くことができます。 IDをカスタムとして返すと、IDでマップにメモを配置できます。 – Hayt