Comment puis-je renvoyer une sous-classe QObject personnalisée à partir de QAbstractListModel et l'utiliser dans un ListView QML. J'ai essayé de retourner les objets en tant que rôle d'affichage et j'utilise dans mon affichage qml display.property pour accéder aux propriétés, ça marche bien mais j'ai vu sur certaines publications des gens utilisant model comme qobject de qml et accédant aux propriétés comme model.property . Ai-je raté quelque chose? Une autre question: Si je veux exposer l'objet au niveau ListView et l'utiliser pour définir un autre panneau comme un détail de la vue maître expose le rôle (dans mon cas affichage) comme une propriété de variante dans le délégué et le définir au niveau listview avec le signal onCurrentItemChanged est la bonne façon de le faire?Renvoyer une sous-classe QObject personnalisée à partir de QAbstractListModel et l'utiliser dans un ListView
ce que je suis en train, mais cela ne fonctionne pas:
#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
le modèle de vue:
#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
mise en œuvre du modèle de vue:
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();
}
En général, un modèle n'expose pas ses objets internes mais seulement des choses comme le rôle d'affichage, etc. vous pouvez cependant ajouter des rôles personnalisés et retourner des choses via le 'QVariant' sur les données (...). Comme un identifiant, pour obtenir l'objet ailleurs. – Hayt
Ce que vous dites est correct et je suis d'accord avec vous, mais dans une situation comme une vue masterdetail où la vue détaillée ne fait pas partie du délégué de la vue principale, c'est très difficile à faire. –
c'est un peu difficile à conseiller sans plus de détails. Vous pouvez avoir une carte quelque part avec les notes et un identifiant. Lorsque vous redonnez l'ID comme personnalisé, vous pouvez simplement localiser la note dans la carte par ID. – Hayt