Как контролировать процесс фильтрации карты с помощью индикатора выполнения
Я хочу проинформировать пользователя о процессе фильтрации точек на карте QML с помощью индикатора выполнения. Этот процесс происходит в три этапа: filterAcceptsRow вызывает rowCount, а затем вызывает данные. Значения, возвращаемые данными, сравниваются с фильтром и проверяются или нет.
вот 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 для этой работы, но безуспешно.
У вас есть представление о решении для реализации.
заранее спасибо
1 ответ
Если вы хотите следить за прогрессом, вы должны реализовать асинхронный рабочий. Он должен завершить один шаг, сделать паузу, уведомить GUI, дать ему время отразить изменение, и только затем сделать следующий шаг, и так до завершения.
Если вы делаете это в тесном цикле, это абсолютно уничтожит вашу производительность, поэтому вы должны позаботиться о том, чтобы она не была слишком мелкой. Что-то вроде индикатора выполнения не должно получать более 10 обновлений в секунду.
Причина, по которой он не работает для вас, заключается в том, что шаг блокируется во время выполнения работы, поэтому индикатор выполнения не может обновиться, пока вся работа не будет завершена.