Всем привет.
Собственно, я слышал, что стандартные SQL модели медленные, но чтобы настолько...
В общем, имею табличку на 10 записей... Каждые 500 мсек в нее добавляется по одной записи
в ячейку от 0 до 9 по очереди. В конце заполнения строки модели делается submitAll().
Так воот, этот QSqlTableModel::submitAll() ну уж оочень медленный..
В моем случае оно занимает 60~100 мсек
Это уже становится заметным, например, если взять окошко и начать его таскать
по рабочему столу, то в момент коммита данных, его перемещение рывком останавливается
(т.е. видно дерганье окошка при перемещении).
Так вот, вопрос: это или у меня лыжи кривые или я что-то недопонял.
Ниже привожу код и проект, мож кто подскажет что делать... (не писать же все самому с нуля??)
= main.cpp =
C++ (Qt)
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
= widget.h =
C++ (Qt)
#ifndef WIDGET_H
#define WIDGET_H
#include <QTableView>
class QSqlTableModel;
class QTimer;
class Widget : public QTableView
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
private:
enum { MaxColumn = 10 };
void startRow();
void commitRow();
void setupValue();
QString m_connection;
QSqlTableModel *m_model = nullptr;
QTimer *m_timer = nullptr;
int m_column = MaxColumn;
};
#endif // WIDGET_H
= widget.cpp =
C++ (Qt)
#include "widget.h"
#include <QTimer>
#include <QElapsedTimer>
#include <QUuid>
#include <QSqlTableModel>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QDebug>
Widget::Widget(QWidget *parent)
: QTableView(parent)
, m_timer(new QTimer(this))
, m_connection(QUuid::createUuid().toString())
{
QSqlDatabase db = QSqlDatabase::addDatabase(QLatin1String("QSQLITE"), m_connection);
db.setDatabaseName(QLatin1String("foo.db"));
Q_ASSERT(db.open());
const QString table = QLatin1String("foo");
QString create = QLatin1String("create table if not exists ") + table + QLatin1Char('(');
for (int i = 0; i < MaxColumn; ++i) {
const QString n = QChar::fromLatin1(65 + i);
if (i + 1 == MaxColumn)
create += n + QLatin1String(" blob");
else
create += n + QLatin1String(" blob,");
}
create += QLatin1Char(')');
QSqlQuery query(db);
query.prepare(create);
Q_ASSERT(query.exec());
m_model = new QSqlTableModel(this, db);
m_model->setEditStrategy(QSqlTableModel::OnManualSubmit);
m_model->setTable(table);
m_model->select();
setModel(m_model);
connect(m_timer, &QTimer::timeout, [this]() {
if (m_column == MaxColumn) {
commitRow();
startRow();
} else {
setupValue();
}
if (m_column < MaxColumn)
++m_column;
else
m_column = 0;
});
m_timer->start(500);
}
Widget::~Widget()
{
delete m_model;
{
QSqlDatabase db = QSqlDatabase::database(m_connection);
db.close();
}
QSqlDatabase::removeDatabase(m_connection);
}
void Widget::startRow()
{
const int rows = m_model->rowCount();
Q_ASSERT(m_model->insertRow(rows));
}
void Widget::commitRow()
{
QElapsedTimer et;
et.start();
m_model->submitAll();
qDebug() << "spent:" << et.elapsed();
}
void Widget::setupValue()
{
const auto row = m_model->rowCount() - 1;
Q_ASSERT(row >= 0);
const auto index = m_model->index(row, m_column);
m_model->setData(index, m_column);
}
Вывод приложения такой:
Debugging starts
spent: 1
spent: 59
spent: 59
spent: 65
spent: 65
spent: 65
spent: 64
spent: 67
spent: 66
spent: 82
spent: 56
spent: 98
Debugging has finished
Тестил на Windows 10 & Qt 5.7.0 & MSVC2015 & 32 bit