QAbstractListModelから派生したモデルを基礎QHashに基づいて作成しました。 QMLでモデルを使用する必要があるため、ソート機能Qtウィジェットとビューを統合することはできません。QAbstractListModelから派生したモデルをQMLのロールでソートSort List
私は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);
ああ、プロキシがモデルとして動作しますが、それはエントリをソートしません。 。すべての
'prepend()'は、モデルを使用しないときにモデルを生成するために使用されますが、それを賢明に使用することに問題はありません。私は検索のためにQHashを使う必要があります。私はすでにストレージのハッシュを使ってデータを別のモデルに転送していますが、元のデータをハッシュから再利用する方法を探しています。モデルは正常に動作するように見えますが、私の問題はソートだけです。 – dtech
コードの上でModelTestを実行しようとすると、驚くかもしれません。 –
これは厳密に指定されたコンテキストで使用され、API全体の一部として完璧であるという考えははるかに排除されており、特に必要な機能のみを目的としています。たぶん、ソートプロキシではうまくいかないのかもしれません。 N1の要件である最速のルックアップのために最適化された基底のコンテナを維持しながら、在庫をモデルで処理するよりも、独自のソートプロキシラッパーを行う方が簡単です。 – dtech