Я бы внес небольшую поправку в функцию setData(). В документации о ней написано: Returns true if successful; otherwise returns false (в этом же примере она ничего не возвращает, хотя это и никак не сказывается на работе). И еще один момент о setData(): The dataChanged() signal should be emitted if the data was successfully set. Т. е. надо сделать так: bool QListModel::setData(const QModelIndex &index, const QVariant &value, int role) { if( !index.isValid()) return false; if( role == Qt::EditRole) { list.replace(index.row(), value.toInt()); // The dataChanged() signal should be emitted if the data was successfully set emit(dataChanged(index, index)); return true; } return false; } В следующем уроке отсутствие emit() сказывается - после редактирования элемента он не перерисовывается автоматически с новым значением пока не выделишь другой элемент. P.S. А вообще уроки замечательные - огромное спасибо!
Лев, а подскажите пожалуйста каким образом модель знает, что нужно работать именно с этим листом list , а если я создам ещё один лист lisr2, например с 4 элементами иинициализирую в конструкторе, то с каким листом будет работать модель?
Вы наверное не совсем поняли, что переменная list не какая-то абстрактная, а вполне конкретная - а именно член класса, который я объявил в самом начале. Соответственно, к какой переменной вы будете обращаться во всех методах модели, те данные и будут отображаться. Но я действительно напрасно не проговорил вопрос о том, откуда как правило берутся данные в модели. То что в моем примере они инициализируются прямо внутри класса не очень типичная ситуация. Как правило данных берутся откуда-то извне (из БД, по сети, из файла и т.д.) И в этом случае обычно просто создается дополнительный метод, который загружает данные в модель. В моем примере это могло бы выглядеть как-то так: void loadData(QList dataList) { emit beginResetModel(); list = dataList; emit endResetModel(); } Испускание сигналов нужно для того, чтобы представление знало, что нужно перезапросить всю модель целиком.
Т.е. если мы унаследовались от QAbstractListModel, то модель автоматически работает с членом класса? А как быть в таком случае, если например в private: секции будет 2 листа private: QList list; QListlist2; в конструкторе инициализируем оба листа QListModel::QListMpdel( QObject *parent) QAbstractListModel( parent ) { list
Я попробовал реализовать, то что спросил. Приложение или падает или не меняет значение. Кажется я стал понимать что тут к чему. Лев, спасибо вам большое за хорошие видео!
Блин, так сложно( Хочу написать небольшую программку для себя, но вот не знаю за сколько во всём разберусь. Уж думаю - может всё же было на электроне реализовать...
метод setData не возвращает значение и не проверяет индекс на валидность, также желательно отправлять сигнал dataChanged() там же, а пользовательский класс лучше не называть Q..., это сбивает с толку новичков
setData должен возвращать значение, и хорошо бы объяснить на что это влияет. Ну и в целом реализация особенностей отображения в модели это писец. Я разачарован qt. Для нормальной работы придеться заводить нормальный слой абстракции для моделей, а это безобразие использовать как часть view. Урок очень толковый, спасибо.
Лев, огромное вам, человеческое! Записывайте еще!
Самое путное видео на эту тему! Даже я наконец понял) Спасибо!
Чудо, а не человек, спасибо в общем ))
Супер, всё предельно ясно. Спасибо.
Спасибо за толковое видео
Спасибо большое! Очень познавательное видео
mate i did not understand what are u saying but i got some code from you which is nice, spasiva
Толково, спасибо. Подпишусь.
Заметил один недочёт - bool QListModel::setData() остался без return
Хорошо, что ты есть.
Я бы внес небольшую поправку в функцию setData(). В документации о ней написано:
Returns true if successful; otherwise returns false (в этом же примере она ничего не возвращает, хотя это и никак не сказывается на работе).
И еще один момент о setData():
The dataChanged() signal should be emitted if the data was successfully set. Т. е. надо сделать так:
bool QListModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
if( !index.isValid()) return false;
if( role == Qt::EditRole) {
list.replace(index.row(), value.toInt());
// The dataChanged() signal should be emitted if the data was successfully set
emit(dataChanged(index, index));
return true;
}
return false;
}
В следующем уроке отсутствие emit() сказывается - после редактирования элемента он не перерисовывается автоматически с новым значением пока не выделишь другой элемент.
P.S. А вообще уроки замечательные - огромное спасибо!
Лев, а подскажите пожалуйста каким образом модель знает, что нужно работать именно с этим листом list , а если я создам ещё один лист lisr2, например с 4 элементами иинициализирую в конструкторе, то с каким листом будет работать модель?
Вы наверное не совсем поняли, что переменная list не какая-то абстрактная, а вполне конкретная - а именно член класса, который я объявил в самом начале. Соответственно, к какой переменной вы будете обращаться во всех методах модели, те данные и будут отображаться. Но я действительно напрасно не проговорил вопрос о том, откуда как правило берутся данные в модели. То что в моем примере они инициализируются прямо внутри класса не очень типичная ситуация. Как правило данных берутся откуда-то извне (из БД, по сети, из файла и т.д.) И в этом случае обычно просто создается дополнительный метод, который загружает данные в модель. В моем примере это могло бы выглядеть как-то так:
void loadData(QList dataList) {
emit beginResetModel();
list = dataList;
emit endResetModel();
}
Испускание сигналов нужно для того, чтобы представление знало, что нужно перезапросить всю модель целиком.
Т.е. если мы унаследовались от QAbstractListModel, то модель автоматически работает с членом класса? А как быть в таком случае, если например в private: секции будет 2 листа
private:
QList list;
QListlist2;
в конструкторе инициализируем оба листа
QListModel::QListMpdel( QObject *parent)
QAbstractListModel( parent )
{
list
Я попробовал реализовать, то что спросил. Приложение или падает или не меняет значение. Кажется я стал понимать что тут к чему. Лев, спасибо вам большое за хорошие видео!
скажите а как добавлять или удалять строки?
а откуда брать коды ???
Блин, так сложно( Хочу написать небольшую программку для себя, но вот не знаю за сколько во всём разберусь. Уж думаю - может всё же было на электроне реализовать...
метод setData не возвращает значение и не проверяет индекс на валидность, также желательно отправлять сигнал dataChanged() там же, а пользовательский класс лучше не называть Q..., это сбивает с толку новичков
setData должен возвращать значение, и хорошо бы объяснить на что это влияет. Ну и в целом реализация особенностей отображения в модели это писец. Я разачарован qt. Для нормальной работы придеться заводить нормальный слой абстракции для моделей, а это безобразие использовать как часть view. Урок очень толковый, спасибо.
Спасибо Вы молодец! Только чавкать и цокать перестаньте, это же учебное пособие, а не репортаж!
Сори но чвак чвак чвак на фоне - раздражает;
Я может что-то не понимаю но по моему тут ты употреблял пищу одновременно. А так все супер.
Чавканье бесит
ничего не понятно + эти слюни весь ведоролик😂😂😂