[Решено] QTableView & QSqlTableModel, событие обновления таблицы |
Здравствуйте, гость ( Вход | Регистрация )
[Решено] QTableView & QSqlTableModel, событие обновления таблицы |
512es |
3.11.2009, 10:56
Сообщение
#1
|
Участник Группа: Участник Сообщений: 135 Регистрация: 31.10.2008 Пользователь №: 407 Спасибо сказали: 5 раз(а) Репутация: 0 |
Всем привет!
Помогите заставить работать QTableView & QSqlTableModel как надо. Может кто уже сталкивался с такой проблемой.. Модель таблицы:
Добавляю новую запись:
Вот так, после добавления записи, курсор переходит на нужную строку и ячейка в режиме редактирования. Проблема: Но стоит только нажать интер, строка записывается в базу и таблица обновляется. Курсор переходит на первую строку. Кроме того, записей в таблице много и подгружаются они не все. Что мешает функции поиска по таблице. Должно работать так: Добавляем строку, она сразу сабмитится в базу с дефолтными значениями. Курсор переходит на добавленную строку и сразу в режим редактирования. При редактировании ячеек, курсор остаётся на той же строке, а не убегает в начало. Таблица подгружается вся, а не часть её, дабы работал быстрый поиск по всей таблице. Как я делаю: Подгружаю таблицу целиком вот так:
Дефолтные значения задаю так:
Сообщение отредактировал 512es - 5.11.2009, 22:07 |
|
|
Litkevich Yuriy |
3.11.2009, 16:51
Сообщение
#2
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
512es,
записей в таблице много и подгружаются они не все. Таблица подгружается вся, а не часть её, дабы работал быстрый поиск по всей таблице. неверное рассуждение. Для понимания зададимся цифрами:В таблице 400 миллионов строк, для обеспечения быстрого поиска используется СУБД, это её основное предназначение. Следовательно подгружаем только то, что нужно держать под рукой, как это делает Qt. Для БЫСТРОГО поиска используем запросы к БД. Добавляем строку, она сразу сабмитится в базу с дефолтными значениями. можно по выделыватся с делегатами, но проще будет создать свою модель. Тем более, что предыдущий пункт о поиске наталкивает на мысль о наследовании от QSqlQueryModel.
|
|
|
512es |
5.11.2009, 11:53
Сообщение
#3
|
Участник Группа: Участник Сообщений: 135 Регистрация: 31.10.2008 Пользователь №: 407 Спасибо сказали: 5 раз(а) Репутация: 0 |
В таблице 400 миллионов строк, для обеспечения быстрого поиска используется СУБД, это её основное предназначение. Следовательно подгружаем только то, что нужно держать под рукой, как это делает Qt. Для БЫСТРОГО поиска используем запросы к БД. Тут я с вами не спорю, но это противоречит концепции программы. В таблице будет 1-2к записей, ну максимум 5к. Я думаю это не слишком сложно будет закешировать любому более менее современному компьютеру. Главная проблема с которой я столкнулся: Если не подгрузить все строки из базы то я не смогу перемешать курсор по таблице. Т.е. selectRow(50) с лёгкостью перенесёт курсор на 50-ую строку. А если я хочу выбрать строку 800 (которая ещё не была получена из базы) то ничего не получится, пока не промотаю скролбар вниз. Таблица же служит элементом навигации. Выбор любой строки стимулирует мгновенное отображение данных в других виджетах. Тем более, что предыдущий пункт о поиске наталкивает на мысль о наследовании от QSqlQueryModel. Были мысли об этом. Но боюсь не решат они проблему перемещения курсора по таблице.. |
|
|
512es |
5.11.2009, 22:06
Сообщение
#4
|
Участник Группа: Участник Сообщений: 135 Регистрация: 31.10.2008 Пользователь №: 407 Спасибо сказали: 5 раз(а) Репутация: 0 |
Решил проблему вот так:
Сегодня заметил что нужную строку всётаки выделяет, но скролл к ней не успевает почему то переходить. Поэтому добавил scrollTo(index), так работает. А ещё, не получалось перехватить автосаммит, чтобы добавить функцию перехода на нужную строку после записи в базу. Поэтому сделал кнопку "Сохранить изменения"=)
Решение немного кривовато, но работает как надо =) А спустя несколько часов набрёл на одну тему, которая решила эту проблему просто идеально!) 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 месяца снова вернулся к этому вопросу, уже в другой программе. спасибо ещё раз МНЕ за подсказку))
|
|
|
Текстовая версия | Сейчас: 28.1.2025, 14:07 |