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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QSqlTableModel + QTableView выделение последней введенной записи  (Прочитано 10602 раз)
dilshodm
Новичок

Offline Offline

Сообщений: 18


Просмотр профиля
« : Сентябрь 18, 2007, 20:51 »

Здравствуйте,

Есть форма, где отображена таблица QTableView *table, показывающая данные с QSqlTableModel *model.
На этой форме есть кнопка "Add", которая вызывает диалог, где пользователь вводит данные для новой записи. При закрытии диалога, введенные данные записываются в БД через model->insertRecord(-1, record).
Чтобы изменения отобразились в таблице, делаю model->select().

Задача: надо установить курсор в таблице на свежевведенную строку. Как лучше это сделать?

Причем, таблица может быть отсортирована по разным полям, и введенная строка скорее всего окажется не нулевой и не последней строкой таблицы.

Пока приходится перебирать все записи на предмет поиска наибольшего id (id последней записи является наибольшей).
« Последнее редактирование: Сентябрь 18, 2007, 20:54 от Dilshod Mukhtarov » Записан

С уважением,
Dilshod
bigirbis
Гость
« Ответ #1 : Сентябрь 19, 2007, 10:10 »

Попробуй это:
Цитировать
QVariant QSqlQuery::lastInsertId () const
Returns the object ID of the most recent inserted row if the database supports it. An invalid QVariant will be returned if the query did not insert any value or if the database does not report the id back. If more than one row was touched by the insert, the behavior is undefined.
Note that for Oracle databases the row's ROWID will be returned, while for MySQL databases the row's auto-increment field will be returned.
See also QSqlDriver::hasFeature().
Записан
Alexandr Az
Гость
« Ответ #2 : Сентябрь 19, 2007, 10:38 »

QSqlQuery::lastInsertId () - это не то немножко.... Точнее совсем не то.
Возвращает исскуственный ключ с сервера последней записи... А если ключ естественный???
Стоило указать версию куте, в 4.3.х тебе не прийдётся с сервака селекты такие дикие делать при каждом апдейте, достаточно вставить в модель, чтобы оно отобразилось в представлении

bool insertRecord ( int row, const QSqlRecord & record )
Записан
Alexandr Az
Гость
« Ответ #3 : Сентябрь 19, 2007, 11:39 »

Хех. Сорри. Не проверил.
Просто submit сделает тот же select и позиция у тебя пропадет...
Ну что, остаётся токи поиск по первичному ключу во воью
Записан
dilshodm
Новичок

Offline Offline

Сообщений: 18


Просмотр профиля
« Ответ #4 : Сентябрь 21, 2007, 03:32 »

Попробуй это:
Цитировать
QVariant QSqlQuery::lastInsertId () const

Спасибо за наводку. По крайней мере, на SQLITE можно будет искать по этому id, вместо того, чтобы искать максимальное id.
Записан

С уважением,
Dilshod
zeonET
Гость
« Ответ #5 : Ноябрь 07, 2010, 16:02 »

Хоть меня и сочтут некроманом, но ребята, помогите выделить последнюю строку.
Все как-то не могу сообразить.
Есть метод добавления строки:
Код:
int Engine::insertGoodItem(QString name, int type, int price)
{
QSqlRecord record = modelGoods->record();
record.setValue( "name", name);
record.setValue( "type", type);
record.setValue( "price", price);

int row=modelGoods->rowCount();
modelGoods->insertRow(row);
bool ok = modelGoods->setRecord(row, record);
modelGoods->submitAll();
return row;
}

Ну а потом соответственно хочу выделить ту новую строку в QTableView :
Код:
void Milano::on_addButton_clicked()
{
int row = engine.insertGoodItem(tr("лалала"), 0, 0);

QModelIndex index = engine.modelGoods->index(row, 1);
ui.tableGoodsView->setCurrentIndex( index );

           ui.tableGoodsView->setFocus();
}
Понимаю что неправильно, т.к. выделяется всегда последняя строка в QTableView, а он может быть остортирован и новая строка будет где-то посредине... Как мне получить последний QModelIndex и его выделить в QTableView ?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #6 : Ноябрь 07, 2010, 17:33 »

Все тут правильно. Если хочешь выделить нужную ячейку, ищи ее так:
Код
C++ (Qt)
for (int i = 0, count = modelGoods->rowCount(); i < count; i++) {
 if (engine.modelGoods->index(row, {ID}).data (Qt::DisplayRole) == "Some value") {
   //Select row
   break;
 }
}
 
Где {ID} - уникальное поле. "Some value" - нужное значение.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Странник
Гость
« Ответ #7 : Январь 27, 2011, 10:46 »

для поиска строки по id можно использовать QAbstractItemModel::match. ничего лучше я не нашел..
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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