Я новичок в Qt, поэтому, пожалуйста, несите меня.Использование QAbstractListModel в ListView
Я успешно удалось заполнить ListView из StringList и QList Объекта *
Что я теперь борется с, чтобы заполнить ListView в QML, используя класс, определенный в C++, производный QAbstractListModel.
Вот прототип моего класса CPP:
class MessageListEntryModel : public QAbstractListModel
{
Q_OBJECT
public:
enum eMLERoleTypes
{
MLERT_MSG = Qt::UserRole+1,
MLERT_COLOR
};
MessageListEntryModel(QObject* parent=0);
virtual ~MessageListEntryModel();
void AddEntry(QString aMessage, QColor aColor);
// pure virtuals implementations
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
int rowCount(const QModelIndex &parent = QModelIndex()) const ;
int columnCount(const QModelIndex &parent = QModelIndex()) const ;
QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const;
QModelIndex parent(const QModelIndex &child) const ;
QHash<int,QByteArray> roleNames();
private:
QList<MessageEntry*> m_vpMessages;
MessageEntry простой класс, который содержит 2, а членов Ассоциации QColor и QString (класс не распространяется QObject).
Мне пришлось реализовать все вышеперечисленные функции, так как они являются чистыми виртуальными в базовом классе (это обычная до сих пор в учебниках/примерах люди упоминаются только о именах и данных о роли).
На пути осуществления roleNames и данных являются следующие:
QHash<int,QByteArray> MessageListEntryModel::roleNames()
{
QHash<int,QByteArray> rez;
rez[MLERT_MSG]="message";
rez[MLERT_COLOR]="messagecolor";
return rez;
}
QVariant MessageListEntryModel::data(const QModelIndex &index, int role) const
{
qDebug()<<" Data asked for "<<index.row()<<" and role "<<role;
if (index.row()<0 || index.row()>=m_vpMessages.size())
{
return QVariant();
}
MessageEntry* entry = m_vpMessages[index.row()];
if (role == MLERT_MSG)
{
return QVariant::fromValue(entry->message);
} else if (role == MLERT_COLOR)
{
return QVariant::fromValue(entry->messageColor);
}
// should be unreachable code
return QVariant();
}
Часть QML в виде списка что-то вроде этого:
ListView {
id: quickMessageListdata
model: quickListModel
delegate: Rectangle {
width: 400
height: 25
color:"#000000"
Text{
text: model.message
color: model.messagecolor
}
}
До сих пор это мое понимание о том, как реализовать вещи в CPP и QML. Для связывания этих двух, я использую следующий код:
MessageListEntryModel* model =new MessageListEntryModel();
// Add various entries
...
// assign model in QML
m_pViewRef->rootContext()->setContextProperty("quickListModel",model);
С кодом выше, когда не работает ничего не отображается в ListView, и я получаю следующие ошибки:
Unable to assign [undefined] to QString
Unable to assign [undefined] to QColor
I» м и регистрируя класс модели, которая будет экспортироваться в QML (не знаю, если это необходимо):
qmlRegisterType<MessageListEntryModel> ("dlti.exported",1,0,"MessageListEntryModel");
Так что вполне очевидно, что либо я missuderstood надлежащее использование производного класса QAbstractListItem ИЛИ Я пропустил простую жизненно важную ключевую информацию.
Я хотел бы поблагодарить некоторых указателей на некоторые соответствующие образцы/учебные пособия (которые также показывают, как правильно обращаться к данным из модели в QML, поскольку я заметил, что в CPP она никогда не проходит через функцию данных).
Также обратите внимание, что я использую qt5, поэтому образцы qt4.8 не будут делать трюк.
EDIT
После долгих часов разочарования, я наконец-то удалось, что было не так с проклятой вещи:
Моя функция roleNames подпись была неправильно! Правильная подпись для перегрузки является:
protected :
QHash<int,QByteArray> roleNames() const;
Пожалуйста, обратите внимание на защиту и Конст модификаторов.
После объявления функции правильный путь, все это работало нормально.
Для дальнейшего уведомления, реализация данных и rowCount была достаточной :).
Спасибо за помощь. Я согласен с ответом BaCaRoZzo, так как я только сумел понять это, посмотрев код на примере.
Как примечание стороны, он хорошо работает как с сообщением, так и с моделью.message.
@BaCaRoZo Я чувствую, что я даже узнал из этого, спасибо! –