Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: arial от Сентябрь 29, 2009, 09:43



Название: [Решено] QTableView выделить ячейку после редактирования
Отправлено: arial от Сентябрь 29, 2009, 09:43
После редактирования ячейки в QTableView пропадает фокус с этой ячейки. Как сделать так, чтобы фокус оставался на отредактированной ячейке?


Название: Re: QTableView выделить ячейку после редактирования
Отправлено: CroCIV от Сентябрь 30, 2009, 07:30
переопределение virtual void focusOutEvent ( QFocusEvent * event )  у этого таблвью не помогает?


Название: Re: QTableView выделить ячейку после редактирования
Отправлено: arial от Октябрь 02, 2009, 08:00
focusOutEvent возникает, когда заходишь в редактируемую ячейку, а мне нужно установить выделение на ячейку сразу после выхода из неё.

Неужели с этим в  QTableView такая проблема? Двигаешься курсорными клвишами по ячейкам, если нужно редактируешь активную ячейку, после окончания редактирования продолжаешь с этой ячейки двигаться к следующим. А тут вообще активная ячейка теряется и двигаться начинаешь с начала таблицы.


Название: Re: QTableView выделить ячейку после редактирования
Отправлено: ranet от Октябрь 02, 2009, 09:35
focusOutEvent возникает, когда заходишь в редактируемую ячейку, а мне нужно установить выделение на ячейку сразу после выхода из неё.

Неужели с этим в  QTableView такая проблема? Двигаешься курсорными клвишами по ячейкам, если нужно редактируешь активную ячейку, после окончания редактирования продолжаешь с этой ячейки двигаться к следующим. А тут вообще активная ячейка теряется и двигаться начинаешь с начала таблицы.
С похожей трудностью сталкивался.. У тебя же QTableView наверное к таблице БД какой-нибудь привинчен?


Название: Re: QTableView выделить ячейку после редактирования
Отправлено: arial от Октябрь 02, 2009, 12:14
С похожей трудностью сталкивался.. У тебя же QTableView наверное к таблице БД какой-нибудь привинчен?
Совершенно верно, работаю с таблицей из базы данных через QSqlRelationalTableModel.


Название: Re: QTableView выделить ячейку после редактирования
Отправлено: Danila_Bagrofff от Октябрь 02, 2009, 13:04
А принудительно установить фокус по окончании редактирования? Это же тоже событие - окончание редактирования.


Название: Re: QTableView выделить ячейку после редактирования
Отправлено: arial от Октябрь 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; }
   }
}
Но этот способ не работает. Видимо я что-то не так делаю.


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


Название: Re: QTableView выделить ячейку после редактирования
Отправлено: Danila_Bagrofff от Октябрь 02, 2009, 15:13
Ранет
Строка не изменит положение в таблице, если отключишь сортировку. Даже если изменится, то все равно можно узнать текущий номер строки/столбца.

Щас покопаюсь...


Название: Re: QTableView выделить ячейку после редактирования
Отправлено: ranet от Октябрь 02, 2009, 16:00
Ранет
Строка не изменит положение в таблице, если отключишь сортировку. Даже если изменится, то все равно можно узнать текущий номер строки/столбца.

Щас покопаюсь...
Хочется не отключать.. код, который у меня по ссылке выше приведен, вполне нормально работает даже и в этом случае.. но хочется как-то более толково его использовать (то есть засунуть куда-нибудь в производный от TableModel класс , и забыть, и чтобы работал:))


Название: Re: QTableView выделить ячейку после редактирования
Отправлено: arial от Октябрь 03, 2009, 22:55
Ответ (http://www.forum.crossplatform.ru/index.php?showtopic=3453&view=findpost&p=24317) найден на соседнем форуме (http://www.forum.crossplatform.ru/index.php):

После того, как модель была отредактирована посылается сигнал QAbstractItemModel::dataChanged (http://doc.crossplatform.ru/qt/4.5.0/qabstractitemmodel.html#dataChanged), сделай для его обработки слот, в котором в свою очередь делай переход на нужную ячейку.


Название: Re: QTableView выделить ячейку после редактирования
Отправлено: ranet от Октябрь 05, 2009, 14:09
Ответ (http://www.forum.crossplatform.ru/index.php?showtopic=3453&view=findpost&p=24317) найден на соседнем форуме (http://www.forum.crossplatform.ru/index.php):

После того, как модель была отредактирована посылается сигнал QAbstractItemModel::dataChanged (http://doc.crossplatform.ru/qt/4.5.0/qabstractitemmodel.html#dataChanged), сделай для его обработки слот, в котором в свою очередь делай переход на нужную ячейку.
Спасибо, тоже использую где-нибудь:) Но пока сделал немножко иначе. Создал свой класс на основе QSqlTableModel, и в нем добавил просто функцию, void my_submit(QDataWidgetMapper * en_mapper, QTableView * en_tableView)  В неё "спрятал" свой упорядочивающий код. И вместо штатного submitall() вызываю её :) - нормально работает. Не слишком нравится, что ей приходится указатели передавать на маппер и на вьюху, но это вобщем фигня - главное теперь все работает. И главное - для любой таблицы, какая есть!


Название: Re: [Решено] QTableView выделить ячейку после редактирования
Отправлено: arial от Октябрь 08, 2009, 10:45
Ещё один удачный вариант (http://www.forum.crossplatform.ru/index.php?showtopic=2941&pid=21236&mode=threaded&start=0#entry21236) с того же форума (http://www.forum.crossplatform.ru/):
Цитировать
Решил я эту задачку... Пришлось изучать исходный код в части работы с базами данных. Как оказалось в этом плане 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;
}


Название: Re: [Решено] QTableView выделить ячейку после редактирования
Отправлено: ranet от Октябрь 08, 2009, 16:23
То есть теперь он будет обновлять в модели из таблицы только ту строку, которая редактировалась.. Я себе скопировал ;) Спасибо!!!


Название: Re: [Решено] QTableView выделить ячейку после редактирования
Отправлено: break от Октябрь 17, 2009, 01:08
Использую БД Firebird + QSqlRelationTableModel + TableView - при установки политики onManualSubmit - фокус с ячейки никуда не пропадает. Кроме того у меня даже после переоткрытия таблицы - например после подтверждения пользователем изменений - восстанавливается активная ячейка через view()->setCurrentIndex();