Сначала кажется, что QListWidget :: itemChanged - это путь, но вскоре вы столкнетесь с проблемой: сигнал посылается для всего - вставки, удаления, изменения цвета, флажков и т. Д.! Итак, в конечном итоге вы пытаетесь установить флаги и фильтровать их повсеместно, перехватывая различные сигналы, чтобы выяснить, было ли редактирование фактическим событием. Это становится очень грязным.
Существует также QAbstractItemModel :: dataChanged, который может показаться хорошим решением. Он даже имеет параметр "const QVector & lstRoles", чтобы вы могли сканировать Qt :: EditRole и посмотреть, действительно ли он был отредактирован. Увы, тут есть одна загвоздка - он вызывается для всего, как QListWidget :: itemChanged, и, к сожалению, для QListWidget в любом случае, параметр role всегда пуст при вызове (я пробовал). Вот тебе и идея ...
К счастью, все еще есть надежда ... Это решение делает свое дело! :
http://falsinsoft.blogspot.com/2013/11/qlistwidget-and-item-edit-event.html
Он использует QAbstractItemDelegate :: closeEditor, но я предпочитаю использовать QAbstractItemDelegate :: commitData.
Так что сделайте соединение вот так ...
connect(ui.pLstItems->itemDelegate(), &QAbstractItemDelegate::commitData, this, &MyWidget::OnLstItemsCommitData);
Затем установите слот, как этот ...
void MyWidget::OnLstItemsCommitData(QWidget* pLineEdit)
{
QString strNewText = reinterpret_cast<QLineEdit*>(pLineEdit)->text();
int nRow = ui.pLstItems->currentRow();
// do whatever you need here....
}
Теперь у вас есть слот, который вызывается только после редактирования текста элемента списка!