Самый быстрый способ получить данные из QSqlTableModel и поместить в QVector & lt; QPointF & gt;

Мне нужно скопировать два столбца из QSqlTableModel и положить в QVector.

Я пытаюсь это:

ParameterData pd;
QSqlTableModel *m = mapTbModels.value(table);
QList<QSqlField> parameterList = getFields(table);

for (int j = 0; j <parameterList.size(); j++) {
QSqlField f = parameterList[j];
QVector<QPointF> v;
if (f.type() != QVariant::Int)
continue;
else {
pd.name = f.name();
timer.start();
for (int i = 0; i < m->rowCount(); i++)
v << value(m, i, f.name());
qDebug() << "Database" << timer.elapsed();
}
pd.data = v;
pd.table = table;
emit data(pd);
emit status(QString::number(j*100/parameterList.size()));
QCoreApplication::processEvents();
}

Какой самый быстрый способ?

1

Решение

Однажды я провел несколько тестов производительности с Qt 5.2 и postgres, чтобы проверить возможности qsql. Оказалось, что использование QSqlTableModel примерно в 1000 раз медленнее, чем использование собственных SQL-запросов, таких как

    QSqlQuery query("",db);
query.prepare("SELECT a.fueltype_longname, coalesce(a.bunkerlog_amount,0) FROM (\
SELECT f.fueltype_longname, b.bunkerlog_amount, rank() OVER (PARTITION BY b.bunkerlog_fueltype ORDER BY b.bunkerlog_id DESC) FROM data.t_bunkerlog2 b\
RIGHT JOIN data.t_fueltype f ON b.bunkerlog_fueltype = f.fueltype_longname  \
) a WHERE a.rank=1");
query.exec();

Так что для приложения, интенсивно использующего данные, используйте query / prepare / exec. Если вы просто хотите показывать пользователю простые таблицы, используйте QSqlTableModel и т. Д. Для удобства.

0

Другие решения


По вопросам рекламы [email protected]