Медленная прокрутка с QTableView на другом компе - PullRequest
3 голосов
/ 31 октября 2011

В настоящее время я разрабатываю приложение для просмотра баз данных, используя 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();

1 Ответ

2 голосов
/ 16 ноября 2011

Итак, проблема в поведении QODBCResult. Я скачал источники Qt и отредактировал драйвер odbc. Для тех, кто заинтересован в этом, вам нужно изменить поведение QODBCResult :: data (int) и хотя бы QODBCResult :: fetch (int) (и, возможно, QODBCResult :: fetchprevious / next / last / first, если вы действительно хотите что-то чистое) функции.

Я лично добавляю буфер QList, где я храню свои строки, когда они запрашиваются. Это почти то же самое поведение, что и в Qt (поскольку он кэширует не все, а только запрошенные строки). Мое приложение занимает до 38-40 МБ в памяти для 22 тыс. Строк / 55 столбцов текста и помещается в кеш.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...