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);
}