LINUX.ORG.RU

QTableWidget запись без инициации OnCellChange

 ,


0

1

Есть таблица, в ней можно меня ячейки. При изменении ячейки (OnCellChange) значение отсылается в устройство, то устанавливает его себе (возможно с коррекцией), отсылает назад сигнал со значением. Сигнал ловится в ПК и рисует в ячейки новое значение.

Есть две баги:
1. Если устройство решает каждый раз подстраивать значение (5,12 -> 5,13; 5,13 -> 5,12; etc) то получаем луп.
2. Если до прихода сигнала-подтверждения написать другое значение (например написали 1, жмакнули enter, написали 2, жмакнули enter, оба сообщения ушли в очередь отправки, ушло 1, пришло 1, отобразилось 1, ушло 2, пришло 2, отобразилось 2) иногда гуй не успевает обработать событие о смене и получается так: ушло 1, пришло 1, ушло 2, отобразилось 1, пришло 2, ушло 1, отобразилось 2, пришло 1, ушло 2... Получается луп 1-2-1-2-1-2...

Самым простым способом все это решить будет на отображение вызывать функцию смены содержимого ячейки такую, которая не будет инициировать OnCellChange, оставив, таким образом, только юзер-initiated вызовы.

Вариант 2 - disconnect\connect на обработчик OnCellChange на период, когда пришло подтверждение и его надо отобразить. Проблема в том, что мгновенно оно не отключится, работает не всегда.

★★

Qt только учу. Знаю, что QтаблицеподобныйWidget в серьйозных проектах пользоваться не комильфо. Связка QTableView и QAbstractItemModel не поможет?

xoomer
()
Последнее исправление: xoomer (всего исправлений: 2)

2) Может просто запретить редактирование, пока от устройства не получено подтверждение?

neversleep ★★
()
Ответ на: комментарий от sambist

Тогда может blockSignals(), вместо connect/disconnect?

Железный способ: выводи значения полученные от устройства в другую таблицу :)

neversleep ★★
()

Имхо надо копать в сторону получения сигнала не от ячейки а от виджета который её редактирует (делегата) - устройству нужно отсылать данные только в этом случае, а не на любое изменение ячейки. Вообще, странно что нет разделения на cellChanged и cellEdited.

slovazap ★★★★★
()
Последнее исправление: slovazap (всего исправлений: 2)
Ответ на: комментарий от slovazap

а от виджета который её редактирует (делегата)

Сорри, ват?

void GUIPageParams::slot_ANSWER_GetInt(int index, int value)
{
    if (index > lenint - 1) emit sig_STATUS_IntIsBigger(index, lenint);
    else tblDataI->item(index, 1)->setText(QString::number(value));
}
sambist ★★
() автор топика
Ответ на: комментарий от neversleep

Спасибо, завтра попробую, совсем забыл про него.

sambist ★★
() автор топика

Вместо QTableWidget используешь QTableView. При этом, при редактировании ячейки ты можешь получать сигналы от делегата (точнее, от виджетов, создаваемых делегатом для редактирования ячейки) об окончании редактирования данных. А при получении данных от железки ты просто пишешь данные в модель, соответственно, сигналов про изменение данных нет.

grondek
()
Ответ на: комментарий от sambist

blockSignals - штука хорошая, но в меру. Она блокирует все сигналы и они полностью теряются. Можно пропустить что-то важное.

grondek
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.