如何在 QtQuick 2 中对 QML TableView 进行排序?

2024-05-18

我想使用 Qt 5.1 实现具有自定义角色的可排序 TableView。但我不知道当用户单击标题时该怎么做才能对其进行排序。

在我的 Qt .pro 文件中,我添加了:

!android: !ios: !blackberry: qtHaveModule(widgets): QT += widgets

在main.cpp中,我使用了QtWidgets/QApplication作为全局应用程序实例,并使用 qmlRegisterType 作为我的新模型类(见下文):

qmlRegisterType<PositionModel>("MyDataModule", 1, 0, "PositionModel");

PositionModel 声明如下:

class PositionModel : public QAbstractTableModel
{
    Q_OBJECT
public:
    enum PositionRoles {
        CustomRol1 = Qt::UserRole + 1,
        CustomRow2,
        PositionRoleMaxPlus1
    };

    explicit PositionModel(QObject *parent = 0);

    int rowCount(const QModelIndex &parent = QModelIndex()) const;
    int columnCount(const QModelIndex &parent = QModelIndex()) const;

    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
    QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const;

    bool setData(const QModelIndex &index, const QVariant &value, int role);

    void setData(QList<QObject*> data);

protected:
    QHash<int, QByteArray> roleNames() const;

private:
    QList<QObject*> m_data;

signals:

public slots:

};

并实施如下:

PositionModel::PositionModel(QObject *parent) :
    QAbstractTableModel(parent)
{
}

QHash<int, QByteArray>
PositionModel::roleNames() const {
    QHash<int, QByteArray> roles;
    roles[CustomRole1] = "CustomRole1";
    roles[CustomRole2] = "CustomRole2";
    return roles;
}


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

int
PositionModel::columnCount(
        const QModelIndex &parent) const
{
    return 2; // two custom rows
}

QVariant
PositionModel::data(
        const QModelIndex &index, int role) const
{
    if (!index.isValid() || (role != Qt::DisplayRole && role<Qt::UserRole))
        return QVariant();


    MyObject* myobj=dynamic_cast<MyObject*>(m_data[index.row()]);
    switch(role){
    case CustomRole1:
    {
        return QVariant(myobj->attribute1());
        break;
    }
    case CustomRole2:
    {
        return QVariant(myobj->attribute2());
        break;
    }
    default:
    {
        break;
    }

    }

    return QVariant();
}

QVariant
PositionModel::headerData(
        int section, Qt::Orientation orientation, int role) const
{
    if (role != Qt::DisplayRole && role<Qt::UserRole)
        return QVariant();


    if (orientation == Qt::Horizontal)
    {
        switch (section)
        {
        case 0:
            return tr("CustomRole1");
        case 1:
            return tr("CustomRole2");
    }
    return QVariant();
}

bool 
PositionModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
    return false;
}

void
PositionModel::setData(QList<QObject*> data)
{
    m_data=data;
}

我的 .qml 文件是:

import QtQuick 2.1
import QtQuick.Controls 1.0
import StockModule 2.0

TableView {
    id: positionlisttable
    sortIndicatorVisible: true
    model: mydata.currentPosition // here "mydata" is an instance of MyData class and is set as a context property to QML. "currentPosition" is a Q_PROPERTY in MyData class, and its return type is QAbstractItemData*.

    TableViewColumn {
        role: "CustomRole1"
        title: "CustomRole1"
        width: 80
    }
    TableViewColumn {
        role: "CustomRole2"
        title: "CustomRole2"
        width: 80
    }
}

在 MyData 类中:

/*QAbstractItemModel*/QObject*
MyData::currentPosition() const
{
    PositionModel* newmd=new PositionModel();
    newmd->setData(m_d->data());
    QSortFilterProxyModel *filterModel = new QSortFilterProxyModel();
    filterModel->setSourceModel(newmd);
    filterModel->setSortRole(PositionModel::CustomRole1);
    filterModel->setDynamicSortFilter(true);
    return filterModel;
}

那么现在我应该继续做什么才能使其可排序呢?


将以下代码添加到 QML 中:

TableView
{
...
    onSortIndicatorColumnChanged: model.sort(sortIndicatorColumn, sortIndicatorOrder)
    onSortIndicatorOrderChanged: model.sort(sortIndicatorColumn, sortIndicatorOrder)
}

确保您的 C++ 模型具有可访问的 sort() 方法,例如:

class MySortFilterProxyModel : public QSortFilterProxyModel
{
    Q_OBJECT
    ...
    Q_INVOKABLE virtual void sort(int column, Qt::SortOrder order = Qt::AscendingOrder)
    {
        qDebug("Sorting by column %d", column);
        QSortFilterProxyModel::sort(column, order);
    }
}

您可以用不同的方式命名该方法,我更喜欢覆盖现有的方法 sort()。

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

如何在 QtQuick 2 中对 QML TableView 进行排序? 的相关文章

随机推荐

  • 如何检查 NTAccount 对象代表组还是用户?

    使用返回的访问规则时 GetAccessRules True True GetType System Security Principal NTAccount 如何判断每个规则中引用的 NTAccount 对象是用户帐户还是组 Update
  • JSP/Servlet HTTP 404 错误处理

    我想在我的网络应用程序中处理 HTML 404 错误 我可以这样写
  • RMI 中的引用传递问题? [复制]

    这个问题在这里已经有答案了 有人可以告诉我我错在哪里 为什么这个 RMI 聊天应用程序不起作用 目标是通过远程对象或序列化对象实现客户端 服务器和逻辑之间的解耦 import javax swing import java awt even
  • Visual Studio 项目有简单的自动备份系统吗?

    我正在使用 Visual Studio 2008 Express 我希望 Visual Studio 或者可能是外接程序 将我的整个项目保存到某种自动增量存档或任何可以帮助我从灾难中恢复的文件中 我对 SVN 或复杂的版本控制系统没有太多需
  • 如何使用 spring-security-oauth2 和 WebClient 自定义 OAuth2 令牌请求的授权标头?

    我正在尝试通过 WebClient 调用升级到 spring security 5 5 1 我发现oauth2clientId and secret现在 URL 已编码为AbstractWebClientReactiveOAuth2Acce
  • SSL 证书可以用于对文件进行数字签名吗?

    我想问一些关于数字签名的问题 我不太确定 我不想创建用于签署某些 PDF 文件的自签名证书 而是想获取已验证数据的 SSL 证书 但问题是 SSL 证书可以用于数字签名文件吗 或者它是否以某种方式不兼容 编辑 澄清一下 这个问题不是关于如何
  • C# 索引范围表达式的错误结果

    我对索引范围运算符有点困惑 我期望表达式myString 0 应该等于myString 0 0 then myString Substring 0 1 or myString 0 ToString 如果是下面的代码 string myStr
  • 当应用程序位于前台时,Angular 8 firebase 推送通知不起作用

    我正在按照此文档在我的 Angular Web 应用程序上实现 FCM 当我发送通知时 当应用程序未处于活动状态时 它会成功接收 接收后台通知 但如果应用程序处于活动状态 我就不会收到通知 请按照下列步骤操作 https dev to ma
  • 像 WhatsApp 一样发送图片

    我做了一个聊天应用程序 我想添加照片 文件共享我的应用程序中的概念与 WhatsApp 相同 我已经使用该应用程序制作了Xmpp Openfire目前我正在使用此功能进行照片共享 但它并不完全可靠 public void sendFile
  • 此页面上的脚本导致 ie 运行缓慢

    问题就在标题中 IE 行为异常 并说有一个脚本运行缓慢 FF 和 Chrome 没有这个问题 我怎样才能找到问题所在 那个页面有很多JS 手动检查不是一个好主意 EDIT 这是我正在处理的一个项目的页面 但我需要一个工具来查找问题 End
  • 尝试使用 JRI 将 R 与我的 Java 应用程序集成,但出现错误。谁能解释一下原因和解决办法吗?

    我需要将 Java 与 R 集成来运行一些数学命令并使用 R 的功能进行绘图 以下部分代码给出了错误 public static void main String args HelloRWorld r new HelloRWorld r h
  • 检测 Google 验证码的挑战窗口何时关闭

    我正在使用谷歌隐形验证码 有没有办法检测挑战窗口何时关闭 我所说的挑战窗口是指您必须选择一些图像进行验证的窗口 目前 我在按钮上放置了一个旋转器 一旦单击按钮 就会呈现验证码挑战 无法向用户提示另一个质询窗口 我以编程方式调用渲染函数 gr
  • R中的重叠矩阵

    我有以下数据框 id channel 1 a 1 b 1 c 2 a 2 c 3 a 我想创建并重叠矩阵 它基本上是一个方阵 行和列标签为 a b c 表中的每个条目显示每个通道共有多少个 id 例如 在上面的例子中 矩阵看起来像 a b
  • Golang:带有 JSON 负载的 http.NewRequest POST 返回错误 500

    我正在开发一个 API 库 有一个API端点 POST 当您发出curl命令时 它是 curl H X API TOKEN API TOKEN http interest graph getprismatic com text topic
  • 请参阅 Java EE eclipse 调试中的 POST 参数

    我在调试 Java EE 方面没有经验 我更像是一个 javascript 人 我需要查看哪些 HTTP POST 参数到达服务器端 我在表单将其操作指向的 jsp 文件中放置了一个断点 现在我在调试变量窗口中找不到 POST 内容 他们在
  • java.lang.LinkageError:尝试重复的类定义

    为什么会发生错误以及如何修复它 02 13 02 pool 4 thread 2 WARN Exception in thread pool 4 thread 2 02 13 02 pool 4 thread 2 WARN java lan
  • 域套接字“sendto”遇到“errno 111,连接被拒绝”

    我正在使用域套接字从另一个进程获取值 就像 A 从 B 获取值一样 它可以运行几个月 但最近 A 向 B 发送消息时偶尔会失败 出现 errno 111 连接被拒绝 我检查了B域套接字绑定文件 它是存在的 我也在另一台机器上做了一些测试 效
  • 安装了 32 位的 Python,显示为 64 位

    我需要运行 32 位版本的 Python 我认为这就是我在我的机器上运行的 因为这是我下载的安装程序 当我重新运行安装程序时 它会将当前安装的 Python 版本称为 Python 3 5 32 位 然而当我跑步时platform arch
  • Ruby on Rails 服务器在 HTTPS POST 请求期间崩溃

    我正在尝试与你沟通城市飞艇API http urbanairship com docs push html broadcast使用 ROR Web 应用程序 在我的控制器中 我有以下代码 require net http require n
  • 如何在 QtQuick 2 中对 QML TableView 进行排序?

    我想使用 Qt 5 1 实现具有自定义角色的可排序 TableView 但我不知道当用户单击标题时该怎么做才能对其进行排序 在我的 Qt pro 文件中 我添加了 android ios blackberry qtHaveModule wi