crossplatform.ru

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

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
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
512es
  опции профиля:
сообщение 5.11.2009, 22:06
Сообщение #2


Участник
**

Группа: Участник
Сообщений: 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
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


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


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


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 18.2.2025, 11:19