Как я могу вернуть подклассу QObject из QAbstractListModel и использовать его в QML ListView.возвращает пользовательский подкласс QObject из QAbstractListModel и использует его в ListView
Я попытался вернуть объекты в качестве роли отображения, и я использую в своем qml display.property для доступа к свойствам, он отлично работает, но я видел на некоторых сообщениях людей, использующих модель как qobject из qml, и доступ к свойствам как model.property , Я что-то упускаю?.
Другой вопрос: если я хочу выставить объект на уровне 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, где подробный вид не является частью делегата master view, это очень сложно сделать. –
Сложно посоветовать без дальнейших подробностей. Вы можете иметь карту где-нибудь с Notes и ID. Когда вы затем укажете ID как пользовательский, вы можете просто найти заметку на карте по id. – Hayt