crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> [Решено] QTableView & QSqlTableModel, событие обновления таблицы
512es
  опции профиля:
сообщение 3.11.2009, 10:56
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 135
Регистрация: 31.10.2008
Пользователь №: 407

Спасибо сказали: 5 раз(а)




Репутация:   0  


Всем привет!
Помогите заставить работать QTableView & QSqlTableModel как надо. Может кто уже сталкивался с такой проблемой..

Модель таблицы:
modell = new QSqlTableModel;
modell->setTable("clients");
modell->setEditStrategy(QSqlTableModel::OnFieldChange);
modell->select();
setModel(modell);


Добавляю новую запись:
int row = modell->rowCount();
modell->insertRow(row);
QModelIndex index = modell->index(row, 1);
setCurrentIndex(index);
edit(index);

Вот так, после добавления записи, курсор переходит на нужную строку и ячейка в режиме редактирования.

Проблема:
Но стоит только нажать интер, строка записывается в базу и таблица обновляется. Курсор переходит на первую строку.
Кроме того, записей в таблице много и подгружаются они не все. Что мешает функции поиска по таблице.

Должно работать так:
Добавляем строку, она сразу сабмитится в базу с дефолтными значениями. Курсор переходит на добавленную строку и сразу в режим редактирования. При редактировании ячеек, курсор остаётся на той же строке, а не убегает в начало. Таблица подгружается вся, а не часть её, дабы работал быстрый поиск по всей таблице.

Как я делаю:
Подгружаю таблицу целиком вот так:
while (modell->canFetchMore()) modell->fetchMore();
setFocus();


Дефолтные значения задаю так:
connect(modell,SIGNAL(primeInsert(int,QSqlRecord &)),this,SLOT(slotPrimeIns(int,QSqlRecord &)));
...
void CliView::slotPrimeIns(int row, QSqlRecord &record)
{
    record.setValue(4,0);
    ...
}


Сообщение отредактировал 512es - 5.11.2009, 22:07
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 3.11.2009, 16:51
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


512es,
Цитата(512es @ 3.11.2009, 13:56) *
записей в таблице много и подгружаются они не все.
Цитата(512es @ 3.11.2009, 13:56) *
Таблица подгружается вся, а не часть её, дабы работал быстрый поиск по всей таблице.
неверное рассуждение. Для понимания зададимся цифрами:
В таблице 400 миллионов строк, для обеспечения быстрого поиска используется СУБД, это её основное предназначение. Следовательно подгружаем только то, что нужно держать под рукой, как это делает Qt. Для БЫСТРОГО поиска используем запросы к БД.

Цитата(512es @ 3.11.2009, 13:56) *
Добавляем строку, она сразу сабмитится в базу с дефолтными значениями.
можно по выделыватся с делегатами, но проще будет создать свою модель. Тем более, что предыдущий пункт о поиске наталкивает на мысль о наследовании от QSqlQueryModel.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
512es
  опции профиля:
сообщение 5.11.2009, 11:53
Сообщение #3


Участник
**

Группа: Участник
Сообщений: 135
Регистрация: 31.10.2008
Пользователь №: 407

Спасибо сказали: 5 раз(а)




Репутация:   0  


Цитата(Litkevich Yuriy @ 3.11.2009, 17:51) *
В таблице 400 миллионов строк, для обеспечения быстрого поиска используется СУБД, это её основное предназначение. Следовательно подгружаем только то, что нужно держать под рукой, как это делает Qt. Для БЫСТРОГО поиска используем запросы к БД.

Тут я с вами не спорю, но это противоречит концепции программы.

В таблице будет 1-2к записей, ну максимум 5к. Я думаю это не слишком сложно будет закешировать любому более менее современному компьютеру.
Главная проблема с которой я столкнулся:
Если не подгрузить все строки из базы то я не смогу перемешать курсор по таблице. Т.е. selectRow(50) с лёгкостью перенесёт курсор на 50-ую строку. А если я хочу выбрать строку 800 (которая ещё не была получена из базы) то ничего не получится, пока не промотаю скролбар вниз.

Таблица же служит элементом навигации. Выбор любой строки стимулирует мгновенное отображение данных в других виджетах.

Цитата(Litkevich Yuriy @ 3.11.2009, 17:51) *
Тем более, что предыдущий пункт о поиске наталкивает на мысль о наследовании от QSqlQueryModel.

Были мысли об этом. Но боюсь не решат они проблему перемещения курсора по таблице..
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
512es
  опции профиля:
сообщение 5.11.2009, 22:06
Сообщение #4


Участник
**

Группа: Участник
Сообщений: 135
Регистрация: 31.10.2008
Пользователь №: 407

Спасибо сказали: 5 раз(а)




Репутация:   0  


Решил проблему вот так:
int row = modell->rowCount();
modell->insertRow(row);
modell->submitAll();
while (modell->canFetchMore()) modell->fetchMore();
setFocus();
QModelIndex index = modell->index(row, 1);
setCurrentIndex(index);
scrollTo(index);
edit(index);


Сегодня заметил что нужную строку всётаки выделяет, но скролл к ней не успевает почему то переходить. Поэтому добавил scrollTo(index), так работает.

А ещё, не получалось перехватить автосаммит, чтобы добавить функцию перехода на нужную строку после записи в базу. Поэтому сделал кнопку "Сохранить изменения"=)
modell->setEditStrategy(QSqlTableModel::OnManualSubmit);

Решение немного кривовато, но работает как надо =)

А спустя несколько часов набрёл на одну тему, которая решила эту проблему просто идеально!)
http://www.forum.crossplatform.ru/index.ph...ost&p=21236
Большущее спасибо mva!)

Таблица целиком подгружается в память один раз. А после, добавляемые строки вносятся по одной через низкоуровневую функцию updateRowInTable(). В результате не надо загружать таблицу заново, возиться с скролами и индексами)

ЗЫ: Вот ещё по этой теме:
http://www.prog.org.ru/index.php?topic=10765

Сообщение отредактировал 512es - 5.11.2009, 22:08
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
512es
  опции профиля:
сообщение 18.3.2010, 4:17
Сообщение #5


Участник
**

Группа: Участник
Сообщений: 135
Регистрация: 31.10.2008
Пользователь №: 407

Спасибо сказали: 5 раз(а)




Репутация:   0  


спустя 4 месяца снова вернулся к этому вопросу, уже в другой программе. спасибо ещё раз МНЕ за подсказку))
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 28.1.2025, 14:07