Russian Qt Forum
Апрель 30, 2024, 17:49 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [Решено] QTableView выделить ячейку после редактирования  (Прочитано 18932 раз)
arial
Гость
« : Сентябрь 29, 2009, 09:43 »

После редактирования ячейки в QTableView пропадает фокус с этой ячейки. Как сделать так, чтобы фокус оставался на отредактированной ячейке?
« Последнее редактирование: Октябрь 03, 2009, 22:56 от arial » Записан
CroCIV
Гость
« Ответ #1 : Сентябрь 30, 2009, 07:30 »

переопределение virtual void focusOutEvent ( QFocusEvent * event )  у этого таблвью не помогает?
Записан
arial
Гость
« Ответ #2 : Октябрь 02, 2009, 08:00 »

focusOutEvent возникает, когда заходишь в редактируемую ячейку, а мне нужно установить выделение на ячейку сразу после выхода из неё.

Неужели с этим в  QTableView такая проблема? Двигаешься курсорными клвишами по ячейкам, если нужно редактируешь активную ячейку, после окончания редактирования продолжаешь с этой ячейки двигаться к следующим. А тут вообще активная ячейка теряется и двигаться начинаешь с начала таблицы.
Записан
ranet
Гость
« Ответ #3 : Октябрь 02, 2009, 09:35 »

focusOutEvent возникает, когда заходишь в редактируемую ячейку, а мне нужно установить выделение на ячейку сразу после выхода из неё.

Неужели с этим в  QTableView такая проблема? Двигаешься курсорными клвишами по ячейкам, если нужно редактируешь активную ячейку, после окончания редактирования продолжаешь с этой ячейки двигаться к следующим. А тут вообще активная ячейка теряется и двигаться начинаешь с начала таблицы.
С похожей трудностью сталкивался.. У тебя же QTableView наверное к таблице БД какой-нибудь привинчен?
Записан
arial
Гость
« Ответ #4 : Октябрь 02, 2009, 12:14 »

С похожей трудностью сталкивался.. У тебя же QTableView наверное к таблице БД какой-нибудь привинчен?
Совершенно верно, работаю с таблицей из базы данных через QSqlRelationalTableModel.
Записан
Danila_Bagrofff
Гость
« Ответ #5 : Октябрь 02, 2009, 13:04 »

А принудительно установить фокус по окончании редактирования? Это же тоже событие - окончание редактирования.
Записан
arial
Гость
« Ответ #6 : Октябрь 02, 2009, 13:56 »

А принудительно установить фокус по окончании редактирования? Это же тоже событие - окончание редактирования.

Пробовал переопределить keyPressEvent у моей QTableView:
Код
C++ (Qt)
void MyTableView::keyPressEvent(QKeyEvent *e)
{
   switch (e->key()) {
case Qt::Key_Enter: {
       if (state() != EditingState || hasFocus()) {
if (currentIndex().isValid())
               emit activated(currentIndex());
           e->ignore();
}
 
// В этом месте пытаюсь активировать нужную ячейку
QPersistentModelIndex newCurrent  = model()->index(currentIndex().row(), currentIndex().column());
selectionModel()->select(newCurrent, QItemSelectionModel::Select);
setFocus();
break;}
   default: {
       bool modified = (e->modifiers() & (Qt::ControlModifier | Qt::AltModifier | Qt::MetaModifier));
       if (!e->text().isEmpty() && !modified) {
           if (!edit(currentIndex(), AnyKeyPressed, e))
               keyboardSearch(e->text());
       }
       e->ignore();
       break; }
   }
}
Но этот способ не работает. Видимо я что-то не так делаю.
Записан
ranet
Гость
« Ответ #7 : Октябрь 02, 2009, 14:43 »

С похожей трудностью сталкивался.. У тебя же QTableView наверное к таблице БД какой-нибудь привинчен?
Совершенно верно, работаю с таблицей из базы данных через QSqlRelationalTableModel.
Тогда ты борешься с теми же граблями, что и я:) Фокус слетает в момент, когда изменения фиксируются в таблице, то есть видимо когда ты вызываешь submit() или submitall(). Причем она может еще и быть переупорядочена, положение строки может измениться: была третьей, стала 128 (если изменил значение поля, по которому она упорядочивается). Тут http://www.prog.org.ru/index.php?topic=8096.msg48534#msg48534 я написал, как с этим можно бороться.. Осталось придумать, как это грамотно применить, например производный класс от QSqlRelationalTableModel сделать, чтобы у него сигнал появился, который бы генерился после выполнения submitall(), и возвращал id отредактированной строки (для случая со вставкой там все предельно просто, сам видишь:) ). Ну а к нему эту упорядочивалку привинтить - и дело в шляпе должно быть.. Сейчас как раз думаю, каким образом это лучше сделать.. Присоединяйся:)
« Последнее редактирование: Октябрь 02, 2009, 16:40 от ranet » Записан
Danila_Bagrofff
Гость
« Ответ #8 : Октябрь 02, 2009, 15:13 »

Ранет
Строка не изменит положение в таблице, если отключишь сортировку. Даже если изменится, то все равно можно узнать текущий номер строки/столбца.

Щас покопаюсь...
Записан
ranet
Гость
« Ответ #9 : Октябрь 02, 2009, 16:00 »

Ранет
Строка не изменит положение в таблице, если отключишь сортировку. Даже если изменится, то все равно можно узнать текущий номер строки/столбца.

Щас покопаюсь...
Хочется не отключать.. код, который у меня по ссылке выше приведен, вполне нормально работает даже и в этом случае.. но хочется как-то более толково его использовать (то есть засунуть куда-нибудь в производный от TableModel класс , и забыть, и чтобы работал:))
Записан
arial
Гость
« Ответ #10 : Октябрь 03, 2009, 22:55 »

Ответ найден на соседнем форуме:

После того, как модель была отредактирована посылается сигнал QAbstractItemModel::dataChanged, сделай для его обработки слот, в котором в свою очередь делай переход на нужную ячейку.
Записан
ranet
Гость
« Ответ #11 : Октябрь 05, 2009, 14:09 »

Ответ найден на соседнем форуме:

После того, как модель была отредактирована посылается сигнал QAbstractItemModel::dataChanged, сделай для его обработки слот, в котором в свою очередь делай переход на нужную ячейку.
Спасибо, тоже использую где-нибудь:) Но пока сделал немножко иначе. Создал свой класс на основе QSqlTableModel, и в нем добавил просто функцию, void my_submit(QDataWidgetMapper * en_mapper, QTableView * en_tableView)  В неё "спрятал" свой упорядочивающий код. И вместо штатного submitall() вызываю её Улыбающийся - нормально работает. Не слишком нравится, что ей приходится указатели передавать на маппер и на вьюху, но это вобщем фигня - главное теперь все работает. И главное - для любой таблицы, какая есть!
Записан
arial
Гость
« Ответ #12 : Октябрь 08, 2009, 10:45 »

Ещё один удачный вариант с того же форума:
Цитировать
Решил я эту задачку... Пришлось изучать исходный код в части работы с базами данных. Как оказалось в этом плане Qt работает довольно примитивно. При использовании политики OnFieldChange результат изменений ячейки данных в Grid сначала отправляется на сервер, а затем для того, чтобы отобразить эти изменения, посылается запрос на загрузку всех данных... Это очень неэффективно... При использовании других политик происходит примерно то же самое, только с задержкой по времени. Для OnManualSubmit - изменения загружаются после команды submilAll. Но в этом случае изменения сохраняются в буфере и отображаются в виджете Grid. Этот момент я и использовал.

После множества экспериментов все свелось к простому дочернему классу:
Код
C++ (Qt)
class MySqlTableModel : public QSqlTableModel {
public:
   MySqlTableModel();
   bool setData(const QModelIndex &, const QVariant &, int);
};
 
MySqlTableModel::MySqlTableModel() : QSqlTableModel() {
   setEditStrategy(QSqlTableModel::OnManualSubmit);
}
 
bool MySqlTableModel::setData(const QModelIndex &index, const QVariant &value, int role) {
   bool lResult = false;
   lResult = QSqlTableModel::setData(index, value, role);
   if (lResult) {
       QSqlRecord rec = record(index.row());
       rec.setValue(index.column(), value);
       rec.setGenerated(index.column(), true);
       lResult = updateRowInTable(index.row(), rec);
   }
   return lResult;
}
Записан
ranet
Гость
« Ответ #13 : Октябрь 08, 2009, 16:23 »

То есть теперь он будет обновлять в модели из таблицы только ту строку, которая редактировалась.. Я себе скопировал Подмигивающий Спасибо!!!
Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #14 : Октябрь 17, 2009, 01:08 »

Использую БД Firebird + QSqlRelationTableModel + TableView - при установки политики onManualSubmit - фокус с ячейки никуда не пропадает. Кроме того у меня даже после переоткрытия таблицы - например после подтверждения пользователем изменений - восстанавливается активная ячейка через view()->setCurrentIndex();
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.088 секунд. Запросов: 22.