Geod24
Geod24

Reputation: 893

Slow scrolling with QTableView on other comp

I'm currently developping a database browsing app using Qt & C++. The databases are in our internal network. I'm working & compiling on Win7 32 bits, with Qt 4.7.3 + qodbc driver. My project goal is to make these data available for our ppl, even if they are travelling, using a VPN in that case. The connection is very slow (I mean: VERY slow).

So, I have a QTableView which I populate with 2k results. I only need a win7 support, and it's working well on our company computers, which are in the network. But on some computers things are really slow, ie scrolling on my QTableView. It seems to only happen while using the VPN. The way I use to populate my QTableView is just doing a setQuery() So I'm wondering if there is some network stuff performed after the query is executed? If so, what can be the problem ? I can't find any answer in Google nor in Qt doc.

EDIT: The problem seems to come directly from QSqlQuery. I've implemented the following model as a trial to avoid useless query (Yes, it's fast and dirty) :

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;

This still gives me the same behaviour. Note: I also use:

while (mySqlAsyncModel->canFetchMore())
    mySqlAsyncModel->fetchMore();

Upvotes: 3

Views: 1153

Answers (1)

Geod24
Geod24

Reputation: 893

So the problem comes from the QODBCResult behaviour. I downloaded Qt's Sources, and edit odbc driver. For those interrested in it, you need to change the behaviour of QODBCResult::data(int) and at least QODBCResult::fetch(int) (and maybe QODBCResult::fetchprevious/next/last/first if you really want something clean) functions.

I personnally add a QList buffer, where I store my rows when they are requested. It's almost the same behaviour as Qt (since it don't cache everything but only the requested rows). My app take up to 38-40 Mbs in memory for 22k rows / 55 columns of text and floats in cache.

Upvotes: 2

Related Questions