-1

我想通过进度条通知用户在 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 来完成这项工作,但没有成功。

您对要实施的解决方案有什么想法吗?

提前致谢

4

1 回答 1

0

如果要监视进度,则必须实现async worker。它必须完成一个步骤,暂停,通知 GUI,给它时间来反映更改,然后才执行下一步,直到完成。

如果你在一个紧密的循环中进行,这绝对会毁掉你的表现,所以你必须注意不要太细粒度。进度条之类的东西每秒更新次数不应超过 10 次。

它对您不起作用的原因是在工作完成时胎面被阻塞,因此进度条在所有工作完成之前无法更新。

于 2018-01-26T12:41:20.307 回答