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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Мое знакомство с QSqlTableModel  (Прочитано 2761 раз)
blood_shadow
Гость
« : Сентябрь 10, 2011, 15:38 »

И так, довелось мне на днях писать программу для работы с БД, сама программа представляла из себя
коннект к базе данных и отображение запрошенных данных в представлении, так как времени у меня
не было я оставил затею использовать QSqlTableModel, а просто сделал сабкласс QAbstractTableModel и
определил ф-ции вроде select() внутри которых я использовал QSqlQuery, пример моей ф-ции select():
Код
C++ (Qt)
bool BooksModel::select(QString tableName)
{
   BookData bookData;
   QSqlQuery query;
   QSqlDatabase::database().transaction();
 
   currentBooksList.clear();
   query.exec(tr("SELECT * FROM `%1`").arg(tableName));
   while (query.next())
   {
       bookData.id = query.value(DB::Column_id).toInt();
       bookData.title = query.value(DB::Column_title).toString();
       bookData.autor = query.value(DB::Column_autor).toString();
       bookData.publisher = query.value(DB::Column_publish).toString();
       bookData.year = query.value(DB::Column_year).toInt();
       bookData.edition = query.value(DB::Column_run).toInt();
       bookData.rating = query.value(DB::Column_rating).toInt();
 
       currentBooksList.append(Book(bookData));
    }
 

Все отлично, но на днях я подумал что это не "тру-вей" и QSqlTableModel сделана не просто так для красоты,
решил сделать тестовую программу, но тут натолкнулся на подводные, хотя и как оказалось камни и не совсем
подводные:

1. Если у таблицы имя кириллическое вызов ф-ции bool QSqlTableModel::select () вернет false и запрос не будет
обработан. Порывшись в исходниках, а именно в qt\src\sql\models\qsqltablemodel.cpp я увидел что они используют
класс QLatin1String, наверно это и есть корень зла
2. После успешного переопределения ф-ции select () проблема осталась в выделении таблицы, короче говоря
таблица отображалась коректно, но ячейку либо строчку выделить нельзя(отображается серым цветом), причем в
если имя таблицы с латиницы отображается все нормально, весьма и весьма странно, короче вам необходимо еще и
переопределить Qt::ItemFlags QAbstractItemModel::flags ( const QModelIndex & index ) const

Вывод как чет я совсем не почуствовал выгод при использовании QSqlTableModel вместо сабкласса
QAbstractTableModel + QSqlQuery для запросов

Буду рад любым мыслям и рассуждениям на данную тематику  Улыбающийся
Записан
Странник
Гость
« Ответ #1 : Сентябрь 10, 2011, 19:40 »

вывод: кириллические имена объектов в БД не тру <= ) а для вашей задачи попробуйте QSqlQueryModel - отображает результаты произвольного запроса только для чтения.

я пользуюсь QSqlTableModel, потому что он поддерживает редактирование. если в качестве источника данных использовать view с instead of триггерами, получается довольно удобно.
Записан
blood_shadow
Гость
« Ответ #2 : Сентябрь 10, 2011, 23:24 »

вывод: кириллические имена объектов в БД не тру <= ) а для вашей задачи попробуйте QSqlQueryModel - отображает результаты произвольного запроса только для чтения.

я пользуюсь QSqlTableModel, потому что он поддерживает редактирование. если в качестве источника данных использовать view с instead of триггерами, получается довольно удобно.
насчет кирилических символов это такое дело, много БД существует именно с русскими именами таблиц, дело
в том что тролли не предусмотрели это использовав класс QLatin1String вместо QString с которым не было бы проблем...
а QSqlQueryModel - можно сделать и для редактирования вот что говорит ассистант:
Код:
The model is read-only by default. To make it read-write, you must subclass it and reimplement setData() and flags().
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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