Здравствуйте, dimka, Вы писали:
D>Здравствуйте, SaZ, Вы писали:
SaZ>>Делайте свой делегат, переопределив один метод:
SaZ>>http://doc.qt.io/qt-5/qitemdelegate.html#setModelData
SaZ>>SaZ>>void MyItemDelegate::setModelData(QWidget * editor, QAbstractItemModel * model, const QModelIndex & index) const
SaZ>>{
SaZ>> emit MyMegaSignal( index );
SaZ>> return QItemDelegate::setModelData(QWidget * editor, QAbstractItemModel * model, const QModelIndex & index);
SaZ>>}
SaZ>>
SaZ>>З.Ы. IgoreАвтор: Igore
Дата: 01.02.16
более общий случай написал. Мой пример подходит именно для тех случаев, когда нужно кидать сигнал только при пользовательском вводе. Если данные менять программно, то у меня сигнал не кинется.
D>Некропостинг, да
Но по теме. Сейчас разбираюсь с этой ша(р)манкой. И у меня вопрос. Что вы подразумеваете под программным изменением данных?
D>В моей программе данные это список, элементами которого являются структуры. tableView отображает через модель эти данные в виде таблицы, каждая строка — элемент списка. И реализован делегат, как вы рекомендовали.
D>Если я чисто программно добавляю элемент к списку между вызовами beginReset() endReset() для модели, то изменение данных в отображении происходит корректно, но ни setModelData() в делегате, ни setData() в модели не вызываются.
D>А если редактирую вручную данные в tableView, то вызываются и setModelData() в делегате, и setData() в модели.
D>Т.е. у меня получается, что и ваш вариант, и вариант IgoreАвтор: Igore
Дата: 01.02.16
равносильны? (при условии, что имеем одно окошко tableView, один экземпляр делегата и один экземпляр модели)
Мне непонятен ваш вопрос. Если вы обновляете целиком модель — то begin/end reset достаточно. Если вы точечно обновляете определённые элементы в какой-то одной позиции, то тогда уже через setData, которые должы дёргать уже emit dataChanged.