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

2023-12-27

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

我尝试使用 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);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 QML ListView 中按角色对 QAbstractListModel 派生模型进行排序 的相关文章

  • 如何对同一列上的数据帧列表中的所有数据帧进行排序?

    我有一个数据框列表dataframes list 举个例子 我把dput dataframes list 在底部 我想对列列表中的所有数据框进行排序enrichment 我可以对一个数据框进行排序 first dataframe lt da
  • 在 C# 中对由整数组成的多维 [] 数组进行排序

    我有以下数组 private int testSamples new testSamples 101 101 它应该代表一个名册 第0到100列 第0到100行 在这个名册中 掉落了各种化学液体 我为之做这件事的人希望以这样的方式工作 他可
  • PyQt4 信号和槽

    我正在使用 PyQt4 编写我的第一个 Python 应用程序 我有一个 MainWindow 和一个 Dialog 类 它是 MainWindow 类的一部分 self loginDialog LoginDialog 我使用插槽和信号 这
  • Qt(在 Windows 上)将权限级别设置为“requireAdministrator”

    我正在使用 Qt Creator 并努力制作 exe文件默认以管理员身份运行 在线阅读所有解决方案我试图将这一行放入我的 pro file QMAKE LFLAGS MANIFESTUAC level requireAdministrato
  • Highcharts 对堆积条形图进行排序

    我没有看到任何与我在 Highcharts 中遇到的确切场景相匹配的解决方案 因此我将我的发现发布在这里 我在 Highcharts 中有一个堆积条形图 需要按值从大到小对条形图进行排序并维护它们的类别关系 通常 首选解决方案是在将数据发送
  • 如何按键中的值对 Redis 哈希进行排序

    Redis 有没有一种好方法来获取按值排序的哈希中的键 我查看了文档 但没有找到直接的方法 另外有人可以解释一下redis中的排序是如何实现的 以及什么吗 本文档 http redis io commands SORT using hash
  • 通过最小元素比较对 5 个元素进行排序

    我必须在 python 中使用元素之间的最小比较次数来建模对 5 个元素的列表进行排序的执行计划 除此之外 复杂性是无关紧要的 结果是一个对的列表 表示在另一时间对列表进行排序所需的比较 我知道有一种算法可以通过 7 次比较 总是在元素之间
  • zsh 问题:在提示符附近显示最新的文件和目录以及建议的最新文件或目录

    在 MacOS Big Sur 11 3 上 这是我的 zshrc 我想获取最新的修改或创建靠近提示的文件和目录 从最新到最旧的排序 这是我当前的配置 zshrc ZSH completion autoload Uz compinit co
  • 如何向 PyQt5 GUI 添加线程?

    所以我使用 QT Designer 创建了一个 GUI 它工作得很好 但在更复杂的调用中 它不会更新主窗口并锁定 我想运行我的CustomComplexFunction 在根据不断变化的后端信息更新主窗口中的文本编辑时 我希望它每 2 秒运
  • Linux 上的静态 Qt5 构建:部署时如何处理字体?

    我使用这些配置选项创建了 Qt 5 2 0 库的静态版本 Ubuntu 12 04 开源 确认许可 force pkg config 发布 静止的 前缀 home juzzlin qt5 无icu opengl桌面 无油嘴滑舌 辅助功能 n
  • 如何让Web Workers在执行计算的同时接收新数据?

    我想使用 Web Workers 对数组进行排序 但随着时间的推移 该数组可能会收到新值 而工作线程仍在执行排序功能 所以我的问题是 在收到新项目后 如何 停止 工作人员的排序计算 以便它可以对该项目的数组执行排序 同时仍然保持已经进行的排
  • 在 Java 中对多语言环境字符串进行排序

    我正在尝试按字符串字段 国家 地区 对对象列表进行排序 每个国家 地区都使用其母语 阿根廷 澳大利亚 奥地利 例如 我想要做的是让 出现在 A 国家之后 因为字母 对应于拉丁语 B 我正在尝试使用默认的 Collat er 但非拉丁名称仍然
  • 使 QLabel 的像素图透明

    我有一个带有 QLabel 和像素图的主窗口 我想让它透明 或不那么不透明 我正在使用下面的代码 ui gt label gt setAttribute Qt WA TranslucentBackground ui gt label gt
  • Qt 相当于 .NET 数据绑定吗?

    Qt 中是否有相当于 NET 数据绑定的功能 我想使用引用数据库中特定实体的 QString 填充一些组合框和其他小部件 但是 如果我可以将数据绑定到这些字符串 而不是基于新的组合框选择再次查询数据库 或者基于构建我自己的将使用 QStri
  • QByteArray 到整数

    正如您可能从标题中看出的那样 我在转换QByteArray为一个整数 QByteArray buffer server gt read 8192 QByteArray q size buffer mid 0 2 int size q siz
  • QT:模块“QtWebView”未安装

    我的操作系统是win10 QT版本是Qt5 7 mingw53 32 目标操作系统是win10 当我使用qmlscene执行qml文件时 发生了一些错误 qrc qml 3 模块 QtWebView 未安装 我的 qml 文件如下 impo
  • QThread - 使用槽 quit() 退出线程

    我想在线程完成运行时通知对象 但是 我无法让线程正确退出 我有以下代码 处理器 cpp thread new QThread tw new ThreadWorker connect tw SIGNAL updateStatus QStrin
  • 一个具有完全透明背景的qt小部件

    我需要创建一个 qt 小部件 它将充当其他一些小部件的父级 并对它们进行排序 现在的问题是如何使其背景完全透明 我想这样做 struct Imp Imp QWidget parent thisWidget new QWidget paren
  • 使用模数按字母顺序对列表进行排序

    我在获取元素列表并按字母顺序对它们进行排序方面没有任何问题 但我很难理解如何使用模数来做到这一点 更新 这是按我的方式工作的代码 但是 我更喜欢下面提供的答案的可重用性 因此接受了该答案
  • Qt - ubuntu中的串口名称

    我在 Ubuntu 上查找串行端口名称时遇到问题 如您所知 为了在 Windows 上读取串口 我们可以使用以下代码 serial gt setPortName com3 但是当我在 Ubuntu 上编译这段代码时 我无法使用这段代码 se

随机推荐

  • Hangfire 有内存作业存储包吗?

    我有一个控制台应用程序来测试 HangFire 这是代码 using System using Hangfire namespace MyScheduler ConsoleApp internal static class Program
  • jQuery AJAX 函数返回 true 或 false 仅返回 false,而一切都很好[重复]

    这个问题在这里已经有答案了 jQuery 函数返回 true 或 false 当一切正常时仅返回 false 我不知道如何解决它以及出了什么问题 到目前为止 我得到了这个 代码 onclick 函数 document on click fo
  • 以编程方式创建 .xls 文件

    有没有办法在 iOS 中以编程方式创建 Excel 文件 这是 XLS 文件的 XML 表示形式的精简版本 只需创建一个像这样的原始 XML 并将其另存为 XLS
  • Xamarin 应用程序在开启深色模式的 Android 设备上自动切换到深色模式

    当在启用了深色主题的 Android 手机上时 我的 Xamarin Forms 应用程序 Shell 项目 会自动切换到深色主题 我不希望这种事发生 我尝试了多种方法来禁用此功能 但没有一个起作用 知道出了什么问题吗 AppShell x
  • 左对齐中心对齐弹性盒的最后一行

    我有一个弹性盒 它的内容是 NxN 正方形 我希望容器在给定显示宽度的情况下容纳尽可能多的这些正方形 我希望弹性盒在页面上居中对齐 然而问题是当我使用 justify content center image 那么最后一行不左对齐 但是如果
  • 我可以通过匹配键将两个序列配对在一起吗?

    假设序列一是访问网络以检索站点 1 2 3 4 5 的内容 但将以不可预测的顺序返回 序列二将访问数据库以检索有关这些相同记录 1 2 3 4 5 的上下文 但出于本示例的目的 将以不可预测的顺序返回 是否有一种 Rx 扩展方法可以将这些组
  • Haml:控制文本周围的空白

    在我的 Rails 模板中 我想使用 HAML 来完成最终的 HTML I will first a href http example com link somewhere a then render this half of the s
  • 如何模拟 User.Identity.GetUserId()?

    我正在尝试对我的代码进行单元测试 其中包括以下行 UserLoginInfo userIdentity UserManager GetLogins User Identity GetUserId FirstOrDefault 我只是卡在一点
  • Android:如何通过 SQlite 的名称从服务器动态加载图像

    我是 android 新手 在根据 Sqlite 的名称显示来自服务器的图像时遇到问题 IE 我只在 SQLite 数据库中存储图像名称 文本 列名称图像 并且我想根据图像想要在 imageview 中显示的 sqlite 图像名称从服务器
  • Solr 嵌套文档未正确设置

    我正在尝试使用子文档创建 solr 文档 我使用的是solr 8 2 0 为了遵守中的说明https lucene apache org solr guide 8 0 indexing nested documents html index
  • 如何隐藏pygame中的标题栏?

    我想知道有人知道如何隐藏 pygame 任务栏吗 我的 pygame 程序真的需要这个 Thanks 您可以使用pygame NOFRAME screen pygame display set mode 640 480 pygame NOF
  • 具有字符串输入的 Tensorflow 数据集不保留数据类型

    All 可重现的下面的代码在 Google Colab 上使用 TF 2 2 0 rc2 运行 改编简单的例子文档 https www tensorflow org api docs python tf data Dataset用于从简单的
  • AWS Lambda@Edge 调试

    我目前正在研究 lambda edge 函数 我在 CloudWatch 或其他调试选项上找不到任何日志 使用 测试 按钮运行 lambda 时 日志将写入 CloudWatch 当 lambda 函数由 CloudFront 事件触发时
  • 如何解决错误:ORA-01406 获取的列值被截断?

    我正在尝试执行这个查询 select from gi todo isim WHERE d insercao gt 04 JUL 13 AND d insercao lt 25 JUL 13 然而 我得到了这个错误 ORA 01406 fet
  • 如何使用 jQuery Mobile 防止链接添加到历史堆栈

    使用 jQuery mobile 我使用带有上一个和下一个链接的列表视图进行分页 一切正常 但我不希望将上一页和下一页添加到历史堆栈中 这个想法是 回击只会转到实际的上一页 我发现执行此操作的唯一方法是将 data rel dialog 添
  • python 2to3 中的 eval(input())

    来自Python2to3 doc http docs python org library 2to3 input 转换input prompt to eval input prompt 在使用 Python 2 几年后 我目前正在尝试学习
  • Objective C:将字符串转换为枚举

    如果我有一个枚举 typedef enum SOMETHING MyEnum 我有一个 NSString SOMETHING 有没有办法可以直接从字符串转到 ENUM 值 我意识到我可以制作一本字典来做到这一点 但我很好奇 在 Object
  • 直接标签将标签放在错误的位置

    我正在尝试做一个情节ggplot2并尝试将标签放置在具有置信区域的平均轨迹上的正确位置 由于我无法共享我的数据 因此我创建了一个可重现的示例 set seed 456 library ggplot2 library directlabels
  • Leafletjs动态绑定到可见标记/簇

    这与之前的一个问题有关 Leafletjs动态地将地图绑定到可见的叠加层 https stackoverflow com questions 45286918 leafletjs dynamically bound map to visib
  • 在 QML ListView 中按角色对 QAbstractListModel 派生模型进行排序

    我创建了一个基于底层 QHash 的 QAbstractListModel 派生模型 由于我需要在 QML 中使用模型 因此我无法使用 Qt 小部件和视图集成的排序功能 我尝试使用 QSortFilterProxyModel 但它似乎不适用