В настоящее время я разрабатываю приложение для просмотра баз данных, используя Qt & C ++.Базы данных находятся в нашей внутренней сети.Я работаю и собираю 32-битную версию Win7 с драйвером Qt 4.7.3 + qodbc.Цель моего проекта - сделать эти данные доступными для наших госзакупок, даже если они путешествуют, с использованием VPN в этом случае.Соединение очень медленное (я имею в виду: ОЧЕНЬ медленное).
Итак, у меня есть QTableView, который я заполняю результатами 2k.Мне нужна только поддержка win7, и она хорошо работает на компьютерах нашей компании, которые находятся в сети.Но на некоторых компьютерах все идет очень медленно, т.е. прокрутка на моем QTableView.Кажется, это происходит только при использовании VPN.Для заполнения моего QTableView я использую только метод setQuery (). Поэтому мне интересно, выполняются ли какие-то сетевые действия после выполнения запроса?Если так, в чем может быть проблема?Я не могу найти ни ответа ни в Google, ни в Qt doc.
РЕДАКТИРОВАТЬ: Проблема, кажется, исходит непосредственно из QSqlQuery.Я реализовал следующую модель в качестве пробной версии, чтобы избежать бесполезного запроса (да, он быстрый и грязный):
class SqlAsyncModel : public QSqlQueryModel
{
public:
explicit SqlAsyncModel(QObject *parent = 0) : QSqlQueryModel(parent) {}
SqlAsyncModel(QSqlQueryModelPrivate &dd, QObject *parent)
: QSqlQueryModel(dd, parent) {}
void queryChange() { _currRow = 0; qu = this->query(); qu.last(); }
virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole)
{
int r = index.row(); int c = index.column();
if(!index.isValid() || role & ~Qt::DisplayRole || r < 0 || c < 0)
return QVariant();
while (_currRow < r)
if (!nextValue()) goto ret;
while (_currRow > r)
if (prevValue()) goto ret;
ret: return (qu.record().value(c));
// Returns value or QVariant() if invalid QSqlRecord
}
private:
inline bool nextValue() { _currRow++; return qu.next(); }
inline bool prevValue() { _currRow--; return qu.previous(); }
int _currRow;
QSqlQuery qu;
Это все еще дает мне то же поведениеПримечание: я также использую:
while (mySqlAsyncModel->canFetchMore())
mySqlAsyncModel->fetchMore();