在其他comp上使用QTableView慢速滚动

时间:2011-10-31 03:45:31

标签: c++ qt optimization

我目前正在使用Qt& amp ;;开发数据库浏览应用程序。 C ++。数据库位于我们的内部网络中。 我在工作&使用Qt 4.7.3 + qodbc驱动程序在Win7 32位上进行编译。 我的项目目标是在这种情况下使用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 个答案:

答案 0 :(得分:2)

所以问题来自QODBCResult行为。 我下载了Qt的Sources,并编辑了odbc驱动程序。 对于那些对它感兴趣的人,你需要改变QODBCResult :: data(int)和至少QODBCResult :: fetch(int)的行为(如果你真的想要干净的话,可能需要QODBCResult :: fetchprevious / next / last / first)功能

我个人添加了一个QList缓冲区,我在请求它时存储我的行。它与Qt的行为几乎相同(因为它不会缓存除了请求的行之外的所有内容)。我的app在内存中占用38-40 Mbs,用于22k行/ 55列文本,并在缓存中浮动。