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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QSqlTableModel with QSqlQuery  (Прочитано 8082 раз)
developer
Гость
« : Январь 22, 2008, 20:18 »

Здравствуйте, скажите пожалуйста, з чем  лучше работать: з qsqltablemodel или qsqlquery, если стоит вопрос економии памяти. Например, есть tableWidget, его можно заполнить с помощью qsqltablemodel:
//==========================
model->setTable("operacii");
model->setFilter("Npr_id = 5 and CurDate > '2002.01.01'");
model->select();
tableWidget->setColumnCount(model->columnCount());
tableWidget->setRowCount(model->rowCount());
for(int row = 0; row < model->rowCount() ; row++)
   for(int col = 0; col < model->columnCount(); col++)
      tableWidget->setItem(row, col, new QTableWidgetItem(model->data(model->index(row,col)).toString()));
//=============================
Или с помощью qsqlquery:
//=========================
QSqlQuery query("select * from some_table");
QSqlQuery rowCount("select count(*) from some_table");
rowCount.seek(0);
tableWidget->setColumnCount(query.count());
tableWidget->setRowCount(rowCount.value(0).toInt());
while(query.next())
{
    tableWidget->setItem(row,col, new QTableWidget(query.value().toString()));
}
//здесь неполный код,но ето неважно.
//=========================
Теперь вопрос к всем кто может помочь:
Где используеться меньше памяти в первом или втором варианте. Профайлером или подобными программами не пользуюсь.

Записан
ритт
Гость
« Ответ #1 : Январь 22, 2008, 21:12 »

qsqlquery жрёт меньше
правда, если ты на таких объёмах собрался экономить, лучше вообще отказаться от кутей
Записан
Alex03
Гость
« Ответ #2 : Январь 23, 2008, 08:09 »

Код:
while(query.next())
{
    tableWidget->setItem(row,col, new QTableWidget(query.value().toString()));
}
надо читать как
Код:
while(query.next())
{
    tableWidget->setItem(row,col, new QTableWidgetItem(query.value().toString()));
}
?

Если Вы удаляете модель после заполнения tableWidget, то остаётся только tableWidget с кучей QTableWidgetItem-ов внутри (подозреваю что ещё и в своей внутренней модели). Т.е. оба способа одинаковы по расходу памяти после удаления модели.

А вот если бы вы в первом случае пользовали QTableView (передав ему свою QSqlTableModel) вместо QTableWidget то скорее всего по памяти съэкономили бы.
Записан
ритт
Гость
« Ответ #3 : Январь 23, 2008, 12:41 »

я говорил непосредственно о qsqlquery Улыбающийся
если нужно сэкономить память, то лучше использовать QTableView вместо QTableWidget
если _необходимо_ экономить память, то вместо использования qsqltablemodel можно отнаследоваться от абстрактной модели, при построении делать два квери (описания столбцов + примари кей) и при отображении данных каждый раз выбирать нужные по примари кей и отображаемым столбцам (без кеширования) - в таком случае производительность заметно упадёт, например, плавной прокрутки вьюхи не получится

мне кажется, игра не стоит свеч
Записан
_govorilka
Гость
« Ответ #4 : Январь 23, 2008, 14:18 »

Я тоже думаю, что игра не стоит свеч. В данном примере лучше думать не о количестве памяти, а об скорости работы программы. Если думать об оптимизации, то я взял QTableView + модельку  унаследованную от QAbstractItemModel, написанную как обвертку над C API какого-либо SQL-сервера (например MySQL или PostgreySQL).
Записан
ритт
Гость
« Ответ #5 : Январь 23, 2008, 14:50 »

говорилка, было бы интересно взглянуть...
если не жалко, кинь на форум или в личку

з.ы. если жалко, забаню Улыбающийся
Записан
Tonal
Гость
« Ответ #6 : Январь 23, 2008, 19:47 »

У нас работает именно так, как _govorilka описал.
Правда из на python. Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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