我目前正在使用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();
答案 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列文本,并在缓存中浮动。