Qt - сигнал, когда редактируется строка QListWidget?

Я работаю в Qt4.7, и у меня есть QListWidget в моем диалоговом окне. У меня есть QString, которая должна соответствовать текущему тексту в строке этого виджета (отдельные строки доступны для редактирования). Глядя на сигналы, связанные с QListWidget, кажется, что есть сигналы, когда выбран другой индекс, но нет, когда изменяется текст текущей выбранной строки. Я думал, что currentTextChanged(QString) сделает это, но это не так. Я также думал попробовать связать каждую отдельную строку с чем-то, но QListWidgetItem не имеет встроенных сигналов. Кто-нибудь знает способ сделать это? Спасибо!


person thnkwthprtls    schedule 26.02.2014    source источник
comment
см. dataChanged сигнал модели   -  person Dmitry Sazonov    schedule 26.02.2014
comment
@DmitrySazonov Сработало, спасибо!   -  person thnkwthprtls    schedule 26.02.2014


Ответы (2)


Я думаю, вам нужно изучить следующий сигнал:

void QListWidget::itemChanged(QListWidgetItem * item)

Но будьте осторожны, потому что он отправляется каждый раз, когда изменяется какое-то свойство элемента, а не только текст. Я помню, как однажды мы столкнулись с проблемой, когда изменили цвета предметов, и из-за этого было вызвано множество ложноположительных слотов. Если вам нужна более тонкая настройка, я думаю, лучше написать классы модели/представления самостоятельно, а не полагаться на QListWidget.

person Predelnik    schedule 26.02.2014

Сначала кажется, что 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....
}

Теперь у вас есть слот, который вызывается только после редактирования текста элемента списка!

person Ph0t0n    schedule 20.06.2015
comment
Хорошее решение! Работает на меня. Перед редактированием убедитесь, что элемент выбран, иначе currentRow() или currentItem() не вернет то, что вы думаете. Кроме того, этот слот не вызывается при отмене редактирования с помощью клавиши Escape. Есть идеи? - person François Beaune; 18.05.2018
comment
Переместил мой вопрос в отдельный пост: stackoverflow.com/questions/50409139/ - person François Beaune; 18.05.2018