Как ведет себя QTable для последней отредактированной ячейки? - PullRequest
0 голосов
/ 29 марта 2012

Когда я редактирую ячейку QTable внутри QDialog и нажимаю кнопку «ОК» для QDialog, значение ячейки равно нулю (если оно не было ничего до редактирования). Таким образом, в слоте для OkButton (т.е. OkButton->clicked()) я получаю доступ к значению каждой ячейки в QTable. Однако последняя отредактированная ячейка еще не заполнена. Странно!

Обратите внимание, что если я щелкну где-нибудь в пределах QTable перед нажатием OkButton, он работает нормально, то есть я могу увидеть значение последней отредактированной ячейки с помощью QTable->text(row, col). Может ли кто-нибудь помочь мне понять, чего здесь не хватает, что приводит к такому поведению?

Еще одно интересное поведение: в слоте для OkButton, поскольку я не нахожу значение, я звоню QMessageBox::information(). Во время отладки, когда я говорю 'next' (в gdb) в этом операторе, выдается сигнал valueChanged() (я ловлю его и печатаю). Я не понимаю, почему этот сигнал так задерживается; почему QTable ранее не записывал измененное значение ??

Ответы [ 2 ]

1 голос
/ 29 марта 2012

У меня нет доступного qt3, но у меня была похожая проблема с QTableView в Qt 4.6.

Возможно, вам придется вызвать функцию endEdit (row, col, true, false):

void QTable :: endEdit (int row, int col, bool accept, bool replace) [virtual protected]

Эта функция вызывается при редактировании на местеячейки в строке, col предлагается остановить.Если ячейка не редактируется или принимает значение ЛОЖЬ, функция возвращается, и содержимое ячейки остается неизменным.

Если значение параметра ИСТИНА - ИСТИНА, содержимое редактора должно быть перенесено в соответствующую ячейку.Если replace - TRUE, текущее содержимое этой ячейки должно быть заменено содержимым редактора (это означает удаление текущего QTableItem ячейки и создание нового для ячейки).В противном случае (если возможно) содержимое редактора должно быть просто установлено на существующий QTableItem этой ячейки.

Мне пришлось вызвать commitData () в моем случае, и это кажетсясделать ту же работу.

0 голосов
/ 29 марта 2012

Одним из возможных решений является запуск endEdit () каким-либо образом.Метод, который я использовал, заключается в получении следующего кода из обработчика / слота OkButton.

mTable->setEnabled(false);  // wil trigger endEdit()
mTable->setEnabled(true);
// Access mTable's cells now
QString cell_content = mTable->text(i, j);

Этот код решил проблему.

...