Как контролировать процесс фильтрации карты с помощью индикатора выполнения

Я хочу проинформировать пользователя о процессе фильтрации точек на карте 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 обновлений в секунду.

Причина, по которой он не работает для вас, заключается в том, что шаг блокируется во время выполнения работы, поэтому индикатор выполнения не может обновиться, пока вся работа не будет завершена.

Другие вопросы по тегам