TableView: сигнал об окончании редактирования
От: Molchalnik  
Дата: 01.02.16 14:02
Оценка:
Прошу помощи. Который день копаю справку, не могу найти нужный сигнал.

Смысл такой: в виджете таблицы в ячейке вводится текст, нажимается энтер, и в этот момент должна запустится моя функция с индексом, указывающим, какая ячейка (столбец-строка) изменена

Пробовал DataChanged, но что-то не вышло. Может, что-то сделал не так с недосыпа?

Короче, как сделать?

Если бы было время, не спрашивал бы, сам бы разобрался. Но времени нет.

Help me!!!
Re: TableView: сигнал об окончании редактирования
От: Igore Россия  
Дата: 01.02.16 14:49
Оценка: 3 (1) +1
Здравствуйте, Molchalnik, Вы писали:

M>Прошу помощи. Который день копаю справку, не могу найти нужный сигнал.

M>Смысл такой: в виджете таблицы в ячейке вводится текст, нажимается энтер, и в этот момент должна запустится моя функция с индексом, указывающим, какая ячейка (столбец-строка) изменена
M>Пробовал DataChanged, но что-то не вышло. Может, что-то сделал не так с недосыпа?
M>Короче, как сделать?
M>Если бы было время, не спрашивал бы, сам бы разобрался. Но времени нет.
M>Help me!!!

У тебя должно в итоге вызываться в модели setData, там уже делай emit dataChanged.
Re: TableView: сигнал об окончании редактирования
От: SaZ  
Дата: 02.02.16 09:02
Оценка:
Здравствуйте, Molchalnik, Вы писали:

M>...

M>Если бы было время, не спрашивал бы, сам бы разобрался. Но времени нет.

Вот такое лучше не писать вообще. Это ваши проблемы. И это неуважение к собеседникам.

M>Help me!!!


Делайте свой делегат, переопределив один метод:

http://doc.qt.io/qt-5/qitemdelegate.html#setModelData

void MyItemDelegate::setModelData(QWidget * editor, QAbstractItemModel * model, const QModelIndex & index) const
{
  emit MyMegaSignal( index );
  return QItemDelegate::setModelData(QWidget * editor, QAbstractItemModel * model, const QModelIndex & index);
}



З.Ы. Igore
Автор: Igore
Дата: 01.02.16
более общий случай написал. Мой пример подходит именно для тех случаев, когда нужно кидать сигнал только при пользовательском вводе. Если данные менять программно, то у меня сигнал не кинется.
Отредактировано 02.02.2016 14:00 SaZ . Предыдущая версия .
Re[2]: TableView: сигнал об окончании редактирования
От: Molchalnik  
Дата: 02.02.16 10:18
Оценка:
Здравствуйте, SaZ, Вы писали:

SaZ>Здравствуйте, Molchalnik, Вы писали:


M>>...

M>>Если бы было время, не спрашивал бы, сам бы разобрался. Но времени нет.

SaZ>Вот такое лучше не писать вообще. Это ваши проблемы. И это неуважение к собеседникам.

Простите, Вы меня неверно поняли. Никакого неуважения.

M>>Help me!!!


SaZ>Делайте свой делегат, переопределив один метод:


Благодарю.
Re[3]: TableView: сигнал об окончании редактирования
От: SaZ  
Дата: 02.02.16 13:24
Оценка: -1
Здравствуйте, Molchalnik, Вы писали:

SaZ>>Вот такое лучше не писать вообще. Это ваши проблемы. И это неуважение к собеседникам.

M>Простите, Вы меня неверно поняли. Никакого неуважения.

Я понимаю, что с вашей стороны нет никакого неуважения. Просто другим так не кажется. Для ознакомления:
http://rsdn.ru/Info/Howtoask.xml
http://stackoverflow.com/help/how-to-ask

Представьте ситуацию. Вы сидите, работаете, и тут к вам прибегают с просьбой: "Срочно сделай за меня мою работу, у меня нет времени, я еду в кино. Денег я тебе за это не дам. За хороший ответ оценку на сайте не выставлю.".
Замотивирует вас такое? Лично меня — не особо. Потому что я трачу своё время, чтобы вам помочь. А помогать в первую очередь хочется тому, кто действительно в помощи нуждается и самостоятельно не может справиться (вариант с "нет времени" — это не "не могу", а "не хочу").
Re[4]: TableView: сигнал об окончании редактирования
От: Molchalnik  
Дата: 02.02.16 15:30
Оценка: +1
Здравствуйте, SaZ, Вы писали:

SaZ>Здравствуйте, Molchalnik, Вы писали:


SaZ>>>Вот такое лучше не писать вообще. Это ваши проблемы. И это неуважение к собеседникам.

M>>Простите, Вы меня неверно поняли. Никакого неуважения.

SaZ>Представьте ситуацию. Вы сидите, работаете, и тут к вам прибегают с просьбой: "Срочно сделай за меня мою работу, у меня нет времени, я еду в кино. Денег я тебе за это не дам. За хороший ответ оценку на сайте не выставлю.".

SaZ>Замотивирует вас такое?

поэтому я и говорю, что Вы меня неверно поняли.

"нет времени" — это не "я могу сделать сам, но хочу в кино с девчонкой" , а "неделю бьюсь над задачей, а завтра сдавать".
И в том, что я упомянул, что время по объективным причинам поджимает (=сроки сдачи проекта подходят), никакого неуважения нет.

Вы вложили тот контекст, который Вам ближе и который исходит из Вашего опыта. Но Ваш опыт уникален, и нужно, имхо, всегда исходить из а) более широкого взгляда, учитывать многозначность реплик, т.е. стремится к большей объективности б) исходить из презумции невиновности

Надеюсь, так моя позиция более понятна. С уважением, Молчальник.
Re[5]: TableView: сигнал об окончании редактирования
От: SaZ  
Дата: 03.02.16 09:16
Оценка:
Здравствуйте, Molchalnik, Вы писали:

M>Надеюсь, так моя позиция более понятна. С уважением, Молчальник.


Мне всё понятно и вас я понял. Просто на многих форумах (тут, stackoverflow и т.п.) так не принято. Никаких претензий, надеюсь я вам помог . Свой первый ответ я чуток дописал.
Re[4]: TableView: сигнал об окончании редактирования
От: _hum_ Беларусь  
Дата: 03.02.16 10:29
Оценка: +1 -1
Здравствуйте, SaZ, Вы писали:

SaZ>Здравствуйте, Molchalnik, Вы писали:


SaZ>>>Вот такое лучше не писать вообще. Это ваши проблемы. И это неуважение к собеседникам.

M>>Простите, Вы меня неверно поняли. Никакого неуважения.

SaZ>Я понимаю, что с вашей стороны нет никакого неуважения. Просто другим так не кажется. Для ознакомления:

SaZ>http://rsdn.ru/Info/Howtoask.xml
SaZ>http://stackoverflow.com/help/how-to-ask

SaZ>Представьте ситуацию. Вы сидите, работаете, и тут к вам прибегают с просьбой: "Срочно сделай за меня мою работу, у меня нет времени, я еду в кино. Денег я тебе за это не дам. За хороший ответ оценку на сайте не выставлю.".

SaZ>Замотивирует вас такое? Лично меня — не особо. Потому что я трачу своё время, чтобы вам помочь. А помогать в первую очередь хочется тому, кто действительно в помощи нуждается и самостоятельно не может справиться (вариант с "нет времени" — это не "не могу", а "не хочу").

неуместная аналогия. вас лично никто не заставляет тратить свое драгоценное время для того, чтобы ответить кому-то.
и мотивация простая — чувство удовлетворения от того, что помог кому-то (человек — существо социальное, и в нем зашита эта потребность в помощи другому) + повышение самооценки.

п.с. по моему опыту, высококвалифицированные спецы даже не задумываются над такими мелочами ("ты меня не уважаешь"), а просто походя отвечают или не отвечают.
Re[2]: TableView: сигнал об окончании редактирования
От: dimka  
Дата: 23.06.20 16:10
Оценка:
Здравствуйте, 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
более общий случай написал. Мой пример подходит именно для тех случаев, когда нужно кидать сигнал только при пользовательском вводе. Если данные менять программно, то у меня сигнал не кинется.


Некропостинг, да Но по теме. Сейчас разбираюсь с этой ша(р)манкой. И у меня вопрос. Что вы подразумеваете под программным изменением данных?

В моей программе данные это список, элементами которого являются структуры. tableView отображает через модель эти данные в виде таблицы, каждая строка — элемент списка. И реализован делегат, как вы рекомендовали.

Если я чисто программно добавляю элемент к списку между вызовами beginReset() endReset() для модели, то изменение данных в отображении происходит корректно, но ни setModelData() в делегате, ни setData() в модели не вызываются.
А если редактирую вручную данные в tableView, то вызываются и setModelData() в делегате, и setData() в модели.

Т.е. у меня получается, что и ваш вариант, и вариант Igore
Автор: Igore
Дата: 01.02.16
равносильны? (при условии, что имеем одно окошко tableView, один экземпляр делегата и один экземпляр модели)
Re[3]: TableView: сигнал об окончании редактирования
От: SaZ  
Дата: 23.06.20 16:54
Оценка:
Здравствуйте, 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.
Re[4]: TableView: сигнал об окончании редактирования
От: XOOIOOX  
Дата: 24.06.20 15:02
Оценка:
Здравствуйте, SaZ, Вы писали:

SaZ>Если вы точечно обновляете определённые элементы в какой-то одной позиции, то тогда уже через setData, которые должы дёргать уже emit dataChanged.


С любыми манипуляциями данных begin/end reset хорошо себя показывает. Давеча решал как раз задачу обновления не через пользовательский ввод ячеек таблицы, а когда данные меняются "где-то там".
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.