Я работаю в Qt4.7, и у меня есть QListWidget в моем диалоговом окне. У меня есть QString, которая должна соответствовать текущему тексту в строке этого виджета (отдельные строки доступны для редактирования). Глядя на сигналы, связанные с QListWidget, кажется, что есть сигналы, когда выбран другой индекс, но нет, когда изменяется текст текущей выбранной строки. Я думал, что currentTextChanged(QString) сделает это, но это не так. Я также думал попробовать связать каждую отдельную строку с чем-то, но QListWidgetItem не имеет встроенных сигналов. Кто-нибудь знает способ сделать это? Спасибо!
Qt - сигнал, когда редактируется строка QListWidget?
Ответы (2)
Я думаю, вам нужно изучить следующий сигнал:
void QListWidget::itemChanged(QListWidgetItem * item)
Но будьте осторожны, потому что он отправляется каждый раз, когда изменяется какое-то свойство элемента, а не только текст. Я помню, как однажды мы столкнулись с проблемой, когда изменили цвета предметов, и из-за этого было вызвано множество ложноположительных слотов. Если вам нужна более тонкая настройка, я думаю, лучше написать классы модели/представления самостоятельно, а не полагаться на QListWidget
.
Сначала кажется, что QListWidget::itemChanged — это то, что нужно, но вскоре вы сталкиваетесь с проблемой: сигнал отправляется для всего — вставок, изменения цвета, установки флажков и всего остального, что «меняет» элемент! Предельник указал на это в своем ответе. Некоторые люди пытались везде ставить флаги и фильтровать, перехватывая различные сигналы, чтобы выяснить, было ли редактирование фактическим событием. Становится очень грязно.
Также есть QAbstractItemModel::dataChanged, что может показаться хорошим решением. У него даже есть параметр "const QVector& lstRoles", чтобы вы могли сканировать Qt::EditRole и посмотреть, действительно ли он был отредактирован. Увы, есть загвоздка — он вызывается для всего, как и QListWidget::itemChanged, и, к сожалению, для QListWidget в любом случае параметр roles всегда пуст при вызове (я пробовал). Так много для этой идеи...
К счастью, надежда еще есть... Это решение помогает! :
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....
}
Теперь у вас есть слот, который вызывается только после редактирования текста элемента списка!
currentRow()
или currentItem()
не вернет то, что вы думаете. Кроме того, этот слот не вызывается при отмене редактирования с помощью клавиши Escape. Есть идеи?
- person François Beaune; 18.05.2018
dataChanged
сигнал модели - person Dmitry Sazonov   schedule 26.02.2014