Qt 子类QSortFilterProxyModel返回错误的行计数()

Qt 子类QSortFilterProxyModel返回错误的行计数(),qt,qstandarditemmodel,qsortfilterproxymodel,Qt,Qstandarditemmodel,Qsortfilterproxymodel,在我的项目中,我使用QStandardItemModel通过子类QStandardItem存储数据。为了在显示之前过滤不必要的项目,我使用子类QSortFilterProxyModel和重新实现的filteraccessrow()。 这里是它的标题: class HierarchicalListSortFilterProxyModel : public QSortFilterProxyModel { Q_OBJECT public: HierarchicalListSortF

在我的项目中,我使用
QStandardItemModel
通过子类
QStandardItem
存储数据。为了在显示之前过滤不必要的项目,我使用子类
QSortFilterProxyModel
和重新实现的
filteraccessrow()

这里是它的标题:

class HierarchicalListSortFilterProxyModel : public QSortFilterProxyModel
{
    Q_OBJECT

public:

    HierarchicalListSortFilterProxyModel();

    void acceptSerieId(int serieId, int serieSrc);
    void abortSerieId(int serieId, int serieSrc);

    void acceptActId(int actId, int actSrc)     {acceptedActId.id = actId; acceptedActId.src = actSrc;}

    void setVideoPreviewsPassing(bool value)    {acceptVideoPreviews = value;}
    void setMediaByActIdPassing(bool value)     {filterMediaByAct = value;}
    void setSeriesByIdPassing(bool value)       {filterSeriesById = value;}

    void setFromStraightenedModel(bool value)   {sourceStraightenedModel = value;}

private:

    UniqueId acceptedActId;
    QVector<UniqueId> acceptedSeries;

    bool acceptVideoPreviews     = false;
    bool filterSeriesById        = false;
    bool filterMediaByAct        = false;

    bool sourceStraightenedModel = false;

protected:

    bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const;
};
问题是,在为代理模型设置源模型并用数据填充源模型后,
rowCount()
返回错误的数字。在我的测试中,它是源代码模型的两倍
rowCount()
。例如:在我的源模型中,rowCount()返回12,但在我的代理中,它返回24。我想我错过了
QSortFilterProxyModel
的工作原理…

请提供一个
bool HierarchicalListSortFilterProxyModel::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const
{
    if (this->sourceModel() == nullptr) return false;

    QModelIndex item_id;
    DataPreviewItem* item;
    const QStandardItemModel* model;

    if (sourceStraightenedModel)
    {
        NonHierarchicalProxyModel* straightened_model;

        straightened_model = dynamic_cast<NonHierarchicalProxyModel*>(this->sourceModel());
        item_id            = straightened_model->mapToSource(straightened_model->index(source_row, 0, source_parent));

        model              = dynamic_cast<const QStandardItemModel*>(straightened_model->getSourceModel());
    }
    else
    {
        model              = dynamic_cast<const QStandardItemModel*>(this->sourceModel());
        item_id            = model->index(source_row, 0, source_parent);
    }

    item                   = dynamic_cast<DataPreviewItem*>(model->itemFromIndex(item_id));

    if (item->isVideoPreview())
        return acceptVideoPreviews;

    if (filterMediaByAct)
        if (item->getActId() != acceptedActId.id || item->getActSrc() != acceptedActId.src)
            return false;

    if (item->getSerieId() == -1)
        return true;

    if (filterSeriesById && item->isImagePreview())
    {
        UniqueId itemSerieId = {item->getSerieId(), item->getSrc()};

        return acceptedSeries.indexOf(itemSerieId) >= 0;
    }

    return QSortFilterProxyModel::filterAcceptsRow(source_row, source_parent);
}