如何使用进度条监控过滤地图进程
How to monitor a filtering map process with a progressbar
我想通过进度条告知用户在QML地图上过滤点的过程。这个过程分三个阶段进行:
filterAcceptsRow 调用rowCount,然后调用data。 data返回的值与filter比较,验证与否。
这里是 filterAcceptsRow() :
bool NavaidsFilter::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const
{
if(!m_boundaryZone.isValid()){
return false;
}
QModelIndex ix = sourceModel()->index(sourceRow, 0, sourceParent);
QGeoCoordinate pos = ix.data(NavaidsModel::PositionRole).value<QGeoCoordinate>();
return m_boundaryZone.contains(pos);
}
这是 rowCount() :
Q_INVOKABLE int rowCount(const QModelIndex & parent = QModelIndex()) const{
Q_UNUSED(parent)
return mPoints.count();
}
这里是 data(),实现了错误的 QProgressDialog :
QVariant data(const QModelIndex & index, int role=Qt::DisplayRole) const {
QProgressDialog filterDialog;
filterDialog.setMinimum(0);
filterDialog.setMaximum(mPoints.count());
filterDialog.show();
filterDialog.setValue(index.row());
const NavaidsPoint &point = mPoints[index.row()];
if (role == PositionRole){
return QVariant::fromValue(point.position());}
else if (role == OACICodeRole){
return point.oaciCode();}
else if (role == CountryCodeRole){
return point.countryCode();}
return QVariant();
}
数据在我看来是代码的重要部分,我们通过 index.row() 知道当前值的索引,通过 rowCount() 知道总值。
通过比较两个数字就知道进度是显而易见的,但是在进度条中显示它并没有像我编码的那样工作。
我试图实现一个 QFutureWatcher 来完成这项工作,但没有成功。
您对要实施的解决方案有想法吗?
提前致谢
如果要监控进度,则必须实施 。它必须完成一个步骤,暂停,通知 GUI,给它时间来反映更改,然后才进行下一步,如此直到完成。
如果你在一个紧密的循环中这样做,这绝对会扼杀你的表现,所以你必须注意不要太细粒度。进度条之类的东西每秒不应超过 10 次更新。
它对您不起作用的原因是在工作完成时胎面被阻挡,因此进度条在所有工作完成之前无法更新。
我想通过进度条告知用户在QML地图上过滤点的过程。这个过程分三个阶段进行: filterAcceptsRow 调用rowCount,然后调用data。 data返回的值与filter比较,验证与否。
这里是 filterAcceptsRow() :
bool NavaidsFilter::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const
{
if(!m_boundaryZone.isValid()){
return false;
}
QModelIndex ix = sourceModel()->index(sourceRow, 0, sourceParent);
QGeoCoordinate pos = ix.data(NavaidsModel::PositionRole).value<QGeoCoordinate>();
return m_boundaryZone.contains(pos);
}
这是 rowCount() :
Q_INVOKABLE int rowCount(const QModelIndex & parent = QModelIndex()) const{
Q_UNUSED(parent)
return mPoints.count();
}
这里是 data(),实现了错误的 QProgressDialog :
QVariant data(const QModelIndex & index, int role=Qt::DisplayRole) const {
QProgressDialog filterDialog;
filterDialog.setMinimum(0);
filterDialog.setMaximum(mPoints.count());
filterDialog.show();
filterDialog.setValue(index.row());
const NavaidsPoint &point = mPoints[index.row()];
if (role == PositionRole){
return QVariant::fromValue(point.position());}
else if (role == OACICodeRole){
return point.oaciCode();}
else if (role == CountryCodeRole){
return point.countryCode();}
return QVariant();
}
数据在我看来是代码的重要部分,我们通过 index.row() 知道当前值的索引,通过 rowCount() 知道总值。
通过比较两个数字就知道进度是显而易见的,但是在进度条中显示它并没有像我编码的那样工作。
我试图实现一个 QFutureWatcher 来完成这项工作,但没有成功。
您对要实施的解决方案有想法吗?
提前致谢
如果要监控进度,则必须实施
如果你在一个紧密的循环中这样做,这绝对会扼杀你的表现,所以你必须注意不要太细粒度。进度条之类的东西每秒不应超过 10 次更新。
它对您不起作用的原因是在工作完成时胎面被阻挡,因此进度条在所有工作完成之前无法更新。