gpt4 book ai didi

qt - 按 QML ListView 中的角色对 QAbstractListModel 派生模型进行排序

转载 作者:行者123 更新时间:2023-12-04 14:29:53 26 4
gpt4 key购买 nike

我已经创建了一个基于底层 QHash 的 QAbstractListModel 派生模型。由于我需要在 QML 中使用模型,因此我无法使用 Qt 小部件和 View 集成的排序功能。

我尝试使用 QSortFilterProxyModel 但它似乎不适用于我的模型。让模型在 QML 中正常工作还不够乏味,现在我被困在排序上。

任何建议表示赞赏。

这是模型来源:

typedef QHash<QString, uint> Data;

class NewModel : public QAbstractListModel {
Q_OBJECT
Q_PROPERTY(int count READ count NOTIFY countChanged)

public:
NewModel(QObject * parent = 0) : QAbstractListModel(parent) {}

enum Roles {WordRole = Qt::UserRole, CountRole};

QHash<int, QByteArray> roleNames() const {
QHash<int, QByteArray> roles;
roles[WordRole] = "word";
roles[CountRole] = "count";
return roles;
}

QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const {
if (index.row() < 0 || index.row() >= m_data.size()) return QVariant();
Data::const_iterator iter = m_data.constBegin() + index.row();

switch (role) {
case WordRole:
return iter.key();
case CountRole:
return iter.value();
} return QVariant();
}

int rowCount(const QModelIndex &parent) const {
Q_UNUSED(parent)
return m_data.size();
}

int count() const { return m_data.size(); }

public slots:
void append(const QString &word) {
bool alreadyThere = m_data.contains(word);
if (alreadyThere) m_data[word]++;
else m_data.insert(word, 1);

Data::const_iterator iter = m_data.find(word);
uint position = delta(iter);

if (alreadyThere) {
QModelIndex index = createIndex(position, 0);
emit dataChanged(index, index);
} else {
beginInsertRows(QModelIndex(), position, position);
endInsertRows();
emit countChanged();
}
}

void prepend(const QString &word) {
if (m_data.contains(word)) m_data[word]++;
else m_data.insert(word, 1);
}

signals:
void countChanged();

private:
uint delta(Data::const_iterator i) {
uint d = 0;
while (i != m_data.constBegin()) { ++d; --i; }
return d;
}

Data m_data;
};

这是“尝试”对其进行排序:
NewModel model;
QAbstractItemModel * pm = qobject_cast<QAbstractItemModel *>(&model);
QSortFilterProxyModel proxy;
proxy.setSourceModel(pm);
proxy.setSortRole(NewModel::WordRole);
proxy.setDynamicSortFilter(true);

唉,代理作为模型工作,但它不会对条目进行排序。

最佳答案

如果启用 QSortFilterProxyModel::setDynamicSortFilter(true),则需要调用一次 QSortFilterProxyModel::sort(...) 函数,让代理知道排序的方式。

这样,每当模型更新时,代理都会自动再次对所有内容进行排序。

proxy.setDynamicSortFilter(true);
proxy.sort(0);

关于qt - 按 QML ListView 中的角色对 QAbstractListModel 派生模型进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16222797/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com