我正在使用Qt和C++开发一个数据库浏览应用程序。数据库位于我们的内部网络中。
我正在Win7 32位上工作和编译,使用Qt 4.7.3 + qodbc驱动程序。
我的项目目标是使这些数据对我们的人员可用,即使他们在旅途中,在这种情况下使用VPN。
连接非常缓慢(我的意思是:非常缓慢)。
因此,我有一个QTableView,其中填充了2k个结果。我只需要支持win7,并且在我们公司的电脑上运行良好,这些电脑位于网络中。 但是在某些计算机上,事情确实很慢,例如在我的QTableView上滚动。似乎只会在使用VPN时发生。我用于填充我的QTableView的方法仅是执行setQuery()。 因此,我想知道是否在查询执行后执行了一些网络操作?如果是这样,问题可能是什么? 我无法在Google或Qt文档中找到任何答案。
编辑:问题似乎直接来自QSqlQuery。我已经实现了以下模型作为避免无用查询的试验(是的,它很快且肮脏):
因此,我有一个QTableView,其中填充了2k个结果。我只需要支持win7,并且在我们公司的电脑上运行良好,这些电脑位于网络中。 但是在某些计算机上,事情确实很慢,例如在我的QTableView上滚动。似乎只会在使用VPN时发生。我用于填充我的QTableView的方法仅是执行setQuery()。 因此,我想知道是否在查询执行后执行了一些网络操作?如果是这样,问题可能是什么? 我无法在Google或Qt文档中找到任何答案。
编辑:问题似乎直接来自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();