QAbstractTableModel::insertRows 将新数据附加到内部 QList

2024-02-20

我有以下类,它代表数据结构中的记录:

#ifndef UECONNECTEDCLIENTRECORD_H
#define UECONNECTEDCLIENTRECORD_H

#include <QtGlobal>
#include <QObject>
#include <QHostAddress>
#include <QString>

class UeConnectedClientRecord : public QObject
{
    Q_OBJECT

private:
    /**
     * @brief m_ueClientName
     */
    QString m_ueClientName;

    /**
     * @brief m_ueClientAddress
     */
    QHostAddress m_ueClientAddress;

    /**
     * @brief m_ueClientPort
     */
    QString m_ueClientPort;

public:
    /**
     * @brief UeConnectedClientRecord
     * @param parent
     */
    explicit UeConnectedClientRecord(const QString& clientName=QString(),
                                     const QHostAddress& clientAddress=QHostAddress(),
                                     const QString& clientPort=QString());

    /**
     * @brief ueSetClientName
     * @param name
     */
    inline void ueSetClientName(const QString& name)
        { this->m_ueClientName=name; }

    /**
     * @brief ueSetClientAddress
     * @param address
     */
    inline void ueSetClientAddress(const QHostAddress& address)
        { this->m_ueClientAddress=address; }

    /**
     * @brief ueSetClientPort
     * @param port
     */
    inline void ueSetClientPort(const QString& port)
        { this->m_ueClientPort=port; }

    /**
     * @brief ueClientName
     * @return client name
     */
    inline const QString& ueClientName() const
        { return this->m_ueClientName; }

    /**
     * @brief ueClientAddress
     * @return client address
     */
    inline const QHostAddress& ueClientAddress() const
        { return this->m_ueClientAddress; }

    /**
     * @brief ueClientPort
     * @return client port
     */
    inline const QString& ueClientPort() const
        { return this->m_ueClientPort; }
};

#endif // UECONNECTEDCLIENTRECORD_H

用于子类化QA抽象表模型 http://doc.qt.io/qt-5/qabstracttablemodel.html#details:

#ifndef UECONNECTEDCLIENTSTABLEMODEL_H
#define UECONNECTEDCLIENTSTABLEMODEL_H

#include <QObject>
#include <QAbstractTableModel>
#include <QList>
#include <QModelIndex>
#include <QVariant>
#include <QHash>
#include <QByteArray>

#include "ueconnectedclientrecord.h"

class UeConnectedClientsTableModel : public QAbstractTableModel
{
    Q_OBJECT

private:
    /**
     * @brief m_ueConnectedClientData
     */
    QList<UeConnectedClientRecord*> m_ueConnectedClientData;

protected:
    /**
     * @brief ueSetConnectedClientData
     * @param clientData
     */
    inline void ueSetConnectedClientData(const QList<UeConnectedClientRecord*>& clientData)
        { this->m_ueConnectedClientData=clientData; }

public:
    /**
     * @brief UeConnectedClientsTableModel
     * @param parent
     */
    UeConnectedClientsTableModel(QObject* parent=Q_NULLPTR);

    /**
     * @brief ueConnectedClientData
     * @return connected client data
     */
    inline const QList<UeConnectedClientRecord*>& ueConnectedClientData() const
        { return this->m_ueConnectedClientData; }

    /**
     * @brief rowCount
     * @param parent
     * @return number of rows in model
     */
    inline int rowCount(const QModelIndex& /*parent*/) const
        { return this->ueConnectedClientData().size(); }

    /**
     * @brief columnCount
     * @return number of columns in model
     */
    inline int columnCount(const QModelIndex& /*parent*/) const
        { return 3; }

    /**
     * @brief data
     * @param index
     * @param role
     * @return data for index
     */
    QVariant data(const QModelIndex& index,
                  int role=Qt::DisplayRole) const;

    /**
     * @brief roleNames
     * @return role names
     */
    QHash<int, QByteArray> roleNames() const;

    /**
     * @brief headerData
     * @param section
     * @param orientation
     * @param role
     * @return header data
     */
    QVariant headerData(int section,
                        Qt::Orientation orientation,
                        int role=Qt::DisplayRole) const;

    /**
     * @brief insertRows
     * @param row
     * @param count
     * @param parent
     * @return true if the rows were successfully inserted; otherwise returns false
     */
    bool insertRows(int row,
                    int count,
                    const QModelIndex& parent=QModelIndex());

    /**
     * @brief removeRows
     * @param row
     * @param count
     * @param parent
     * @return true if the rows were successfully removed; otherwise returns false
     */
    bool removeRows(int row,
                    int count,
                    const QModelIndex& parent=QModelIndex());

public:
    /**
     * @brief ueRoleClientName
     */
    static const int ueRoleClientName=Qt::UserRole+1;

    /**
     * @brief ueRoleClientAddress
     */
    static const int ueRoleClientAddress=Qt::UserRole+2;

    /**
     * @brief ueRoleCllientPort
     */
    static const int ueRoleCllientPort=Qt::UserRole+3;
};

#endif // UECONNECTEDCLIENTSTABLEMODEL_H

及其实施:

#include "ueconnectedclientstablemodel.h"

UeConnectedClientsTableModel::UeConnectedClientsTableModel(QObject* parent)
    : QAbstractTableModel(parent)
{
}   // constructor

QVariant UeConnectedClientsTableModel::data(const QModelIndex& index,
                                            int role) const
{
    switch(role)
    {
        case ueRoleClientName:
        {
            return this->ueConnectedClientData().at(index.row())->ueClientName();
        }   // case

        case ueRoleClientAddress:
        {
            return this->ueConnectedClientData().at(index.row())->ueClientAddress().toString();
        }   // case

        case ueRoleCllientPort:
        {
            return this->ueConnectedClientData().at(index.row())->ueClientPort().toInt();
        }   // case

        default:
        {
            return UeConnectedClientsTableModel::data(index,
                                                      role);
        }   // default
    }   // switch
}   // data

QHash<int, QByteArray> UeConnectedClientsTableModel::roleNames() const
{
    QHash<int, QByteArray> roles;

    const int roleClientName=UeConnectedClientsTableModel::ueRoleClientName;
    const int roleClientAddress=UeConnectedClientsTableModel::ueRoleClientAddress;
    const int roleCllientPort=UeConnectedClientsTableModel::ueRoleCllientPort;

    roles.insert(roleClientName,
                 "roleClientName");
    roles.insert(roleClientAddress,
                 "roleClientAddress");
    roles.insert(roleCllientPort,
                 "roleCllientPort");

    return roles;
}   // roleNames

QVariant UeConnectedClientsTableModel::headerData(int section,
                                                  Qt::Orientation orientation,
                                                  int role) const
{
    Q_UNUSED(orientation)

    if(role!=Qt::DisplayRole)
        return QVariant();

    switch(section)
    {
        case 0:
        {
            return tr("Client name");
        }   // case

        case 1:
        {
            return tr("Client address");
        }   // case

        case 2:
        {
            return tr("Client port");
        }   // case

        default:
        {
            return QVariant();
        }   // default
    }   // switch
}   // headerData

bool UeConnectedClientsTableModel::insertRows(int row,
                                              int count,
                                              const QModelIndex& parent)
{
    this->beginInsertRows(parent,
                          row,
                          row+count);

    for(int index=row; index<row+count; index++)
    {
        m_ueConnectedClientData.append(new UeConnectedClientRecord());
    }   // for

    this->endInsertRows();

    return true;
}   // insertRows

bool UeConnectedClientsTableModel::removeRows(int row,
                                              int count,
                                              const QModelIndex& parent)
{
    this->beginRemoveRows(parent,
                          row,
                          row+count);

    for(int index=row; index<row+count; index++)
    {
        m_ueConnectedClientData.removeLast();
    }   // for

    this->endRemoveRows();

    return true;
}   // removeRows

现在,我该如何打电话insertRows()从代码插入新的UeConnectedClientRecord与真实数据(不是new UeConnectedClientRecord()- 默认构造函数)到内部QList?我问是因为我在互联网上搜索过例子,我发现Qt 地址簿示例 http://doc.qt.io/qt-5/qtwidgets-itemviews-addressbook-example.html, 然而,insertRows() 来自官方文档 http://doc.qt.io/qt-5/qabstractitemmodel.html#insertRows and 地址簿示例中的 insertRows() http://doc.qt.io/qt-5/qtwidgets-itemviews-addressbook-example.html声明方式不同:

  • bool QAbstractItemModel::insertRows(int row, int count, const QModelIndex &parent = QModelIndex()); from docs http://doc.qt.io/qt-5/qabstractitemmodel.html#insertRows
  • bool insertRows(int position, int rows, const QModelIndex &index = QModelIndex()) Q_DECL_OVERRIDE; from 地址簿示例 http://doc.qt.io/qt-5/qtwidgets-itemviews-addressbook-example.html

Why?


来自文档:

如果您实现自己的模型,并且想要支持插入,则可以重新实现此函数。或者,您可以提供自己的 API 来更改数据。无论哪种情况,您都需要致电beginInsertRows() and endInsertRows()通知其他组件模型已更改。

方式一、使用insertRows + setData。 Qt 假设可能存在空记录,并且添加行并不是添加数据。由于您的内部列表是Qlist的指针,您可以插入nullptr在那里防止默认构造函数调用。在这种情况下,您需要对每个项目进行项目检查data调用:如果该项目是nullptr,应该返回一个默认值。

方式2.您可以实现自己的插入功能。据我所知,insertRows函数不被视图使用,通常手动调用。但“通常”并不等于“总是”。例如,代理模型可以使用它。

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

QAbstractTableModel::insertRows 将新数据附加到内部 QList 的相关文章

  • C 程序从连接到系统的 USB 设备读取数据

    我正在尝试从连接到系统 USB 端口的 USB 设备 例如随身碟 获取数据 在这里 我可以打开设备文件并读取一些随机原始数据 但我想获取像 minicom teraterm 这样的数据 请让我知道我可以使用哪些方法和库来成功完成此操作以及如
  • 从多线程程序中调用 system()

    我们正在开发一个用 C 编写的多线程内存消耗应用程序 我们必须执行大量的 shellscript linux 命令 并获取返回码 读完之后article http www linuxprogrammingblog com threads a
  • 在 C# 中生成 HMAC-SHA1

    我正在尝试使用 C 来使用 REST API API 创建者提供了以下用于 hmac 创建的伪代码 var key1 sha1 body var key2 key1 SECRET KEY var key3 sha1 key2 var sig
  • SSL/TLS/HTTPS 站点在 C#/.NET WebBrowser 控件中非常慢,但在 Internet Explorer 中则很好

    背景 我正在修改自动维基浏览器 http en wikipedia org wiki Wikipedia AutoWikiBrowser使用托管在安全服务器上的 MediaWiki 站点 我允许用户通过 C 应用程序中的 WebBrowse
  • 如何尝试/捕获所有异常

    我正在完成由其他人启动的 UWP 应用程序 该应用程序经常崩溃 我总是陷入困境应用程序 at if global System Diagnostics Debugger IsAttached global System Diagnostic
  • mprotect 之后 malloc 导致分段错误

    在使用 mprotect 保护内存区域后第一次调用 malloc 时 我遇到分段错误 这是执行内存分配和保护的代码片段 define PAGESIZE 4096 void paalloc int size Allocates and ali
  • 获取尚未实例化的类的函数句柄

    我对 C 相当陌生 我想做的事情可能看起来很复杂 首先 我想获取一些函数的句柄以便稍后执行它们 我知道我可以通过以下方式实现这一目标 List
  • 无法解析远程名称 - webclient

    我面临这个错误 The remote name could not be resolved russgates85 001 site1 smarterasp net 当我请求使用 Web 客户端读取 html 内容时 出现错误 下面是我的代
  • C# 委托责任链

    为了我的理解目的 我实现了责任链模式 Abstract Base Type public abstract class CustomerServiceDesk protected CustomerServiceDesk nextHandle
  • 2D morton 码编码/解码 64 位

    如何将给定 x y 的莫顿代码 z 顺序 编码 解码为 32 位无符号整数 生成 64 位莫顿代码 反之亦然 我确实有 xy2d 和 d2xy 但仅适用于 16 位宽的坐标 产生 32 位莫顿数 在网上查了很多 但没有找到 请帮忙 如果您可
  • C++11 动态线程池

    最近 我一直在尝试寻找一个用于线程并发任务的库 理想情况下 是一个在线程上调用函数的简单接口 任何时候都有 n 个线程 有些线程比其他线程完成得更快 并且到达的时间不同 首先我尝试了 Rx 它在 C 中非常棒 我还研究了 Blocks 和
  • 二叉树中的 BFS

    我正在尝试编写二叉树中广度优先搜索的代码 我已将所有数据存储在队列中 但我不知道如何访问所有节点并消耗它们的所有子节点 这是我的 C 代码 void breadthFirstSearch btree bt queue q if bt NUL
  • 从 R 到 C 处理列表并访问它

    我想使用从 R 获得的 C 列表 我意识到这个问题与此非常相似 使用 call 在 R 和 C 之间传递数据帧 https stackoverflow com questions 6658168 passing a data frame f
  • .NET 客户端中 Google 表格中的条件格式请求

    我知道如何在 Google Sheets API 中对值和其他格式进行批量电子表格更新请求 但条件格式似乎有所不同 我已正确设置请求 AddConditionalFormatRuleRequest formatRequest new Add
  • asp.net网格分页的SQL查询

    我在用iBatis and SQLServer 使用偏移量和限制进行分页查询的最佳方法是什么 也许我添加该列ROW NUMBER OVER ORDER BY Id AS RowNum 但这只会阻止简单查询的数据访问 在某些情况下 我使用选择
  • 为什么要在 C++ 中使用 typedef?

    可以说我有 set
  • 0-1背包算法

    以下 0 1 背包问题是否可解 浮动 正值和 浮动 权重 可以是正数或负数 背包的 浮动 容量 gt 0 我平均有 这是一个相对简单的二进制程序 我建议用蛮力进行修剪 如果任何时候你超过了允许的重量 你不需要尝试其他物品的组合 你可以丢弃整
  • 在 C++17 中使用 成员的链接错误

    我在 Ubuntu 16 04 上使用 gcc 7 2 并且需要使用 C 17 中的新文件系统库 尽管确实有一个名为experimental filesystem的库 但我无法使用它的任何成员 例如 当我尝试编译此文件时 include
  • 受限 AppDomain 中的代码访问安全异常

    Goal 我需要在权限非常有限的 AppDomain 中运行一些代码 它不应该访问任何花哨或不安全的内容 except对于我在其他地方定义的一些辅助方法 我做了什么 我正在创建一个具有所需基本权限的沙箱 AppDomain 并创建一个运行代
  • 服务器响应 PASV 命令返回的地址与建立 FTP 连接的地址不同

    System Net WebException 服务器响应 PASV 命令返回的地址与建立 FTP 连接的地址不同 在 System Net FtpWebRequest CheckError 在 System Net FtpWebReque

随机推荐

  • MATLAB 绘图轴所在框中缺少黑线

    在 MATLAB 中绘制图形时 我注意到保存轴的黑盒部分丢失了 左侧和底部 我尝试过发出 box off box on 命令没有成功 你知道我可以做什么来获得轴上相应的黑线吗 Note 我正在使用 OpenGL 渲染器 set 0 Defa
  • Angular 通用元标记在页面源中不可见

    当我查看在我的角度通用项目的构造函数中设置标题和元标记的页面时 标题显示在选项卡中 当我单击 检查元素 并转到时 我可以在 html 中看到元标记和标题到 html 文档的头部 但是 如果您仅单击 查看页面源代码 则不会显示标签 也不会显示
  • 自定义dateutil.parser世纪推理逻辑

    我正在处理具有两位数年份的旧文本文件 其中默认世纪逻辑dateutil parser似乎效果不太好 例如 珍珠港袭击事件并未发生dparser parse 12 7 41 返回 2041 12 7 回滚到 1900 年代的内置世纪 阈值 似
  • 左移 (<<) 是 C++11 中负整数未定义行为吗?

    左移是负数吗intC 11 中未定义的行为 这里的相关标准段落来自 5 8 2 E1 让我困惑的部分是 否则 如果 E1 具有有符号类型和非负值 且 E1 2E2 可以用结果类型表示 那么这就是结果值 否则 行为是未定义的 这是否应该被解释
  • 简单的iframe不显示在github页面上

    我定期嵌入iframes在我的 github io 页面中 但这个失败了 我不明白为什么 The iframe 嵌入此页面的多个位置 并且没有出现 https seinecle github io codapps generated htm
  • 从外部触发 Perfect 工作流程

    我目前有一个在 EC2 实例上本地运行的 Prefect 工作流程 我可以通过 UI 在 localhost 8080 上触发我的工作流程 有没有办法通过 REST API 或其他方式在外部触发 Prefect 工作流程 例如 AWS La
  • Errno 13,尝试读取文件时权限被拒绝

    我创建了一个小的 python 脚本 我正在尝试读取 txt 文件 但我的访问被拒绝 解决了 13 号错误 这是我的代码 import time import os destPath C Users PC Desktop New folde
  • Nancy 测试在其他程序集中找不到路线

    我有以下规格 使用 Machine Specifications 或 mSpec public class when a user logs in successfully static Browser browser static Bro
  • 通过 godaddy SMTP 发送电子邮件的正确设置是什么?

    我在电子邮件和 Office 下使用 GoDaddy 专业电子邮件 不是工作区电子邮件 对于我的网站 我想使用 PHPMailer 向用户发送电子邮件 我已根据 GoDaddy 电子邮件服务器信息使用了所有凭据 根据 GoDaddy 的说法
  • 如何制作一个可拉伸以适合包装物品的弹性盒容器? [复制]

    这个问题在这里已经有答案了 我想要一个flex direction column Flexbox 容器的宽度会增长以适合包含的元素 在此代码笔中 http codepen io justinmc pen ZYwWMz 灰色的 div 是 F
  • 排序规则问题 - SQL Server 2005

    我想了解我在 SQL Server 2005 实例上遇到的这个错误 错误如下 无法解决排序规则冲突 在 Latin1 General CI AI 和 SQL Latin1 General CP1 CI AI 中 等于操作 简单查询中包含的两
  • 列出通过 RFC 连接时允许的方法?

    我可以通过 SAP RFC 以用户 foo 和密码 bar 的身份从我的计算机连接到 SAP 服务器 是否可以通过 SAP RFC 进行自省 我想知道允许用户 foo 执行哪些方法 我正在使用 PyRFC 但据我所知 这对于这个问题来说应该
  • Qt 气球提示

    在我的 Qt 应用程序中 我想使用气球 气球提示 如Windows 用户体验指南 http msdn microsoft com en us library windows desktop dn742400 aspx 不是系统托盘气球 Qt
  • 如何从 React Native Navigator 中删除标题?

    我有一个标签栏导航器 水平滑动 并设置在屏幕底部 我希望该栏仅包含图标 没有标题 这是当前的设计 这是代码 const AppTabNavigator createMaterialTopTabNavigator Home screen Ho
  • 获取videoview下播放视频的进度时间?

    我需要获取 VideoView 中播放的视频的进度时间 即进度条左侧显示的时间 任何帮助将不胜感激 谢谢 您可以通过以下方式获取视频的持续时间mVideoView getDuration 最初将进度条设置为 0 然后通过以下方式获取视频的当
  • 如何在使用多线程时更新 aspx 页面

    我正在使用多线程来更新 显示页面内容 页面正在使用多个 和嵌套的 更新面板 现在 我正在使用以下logic更新页面 我有七个线程 每个线程通过查询数据库获取数据并将其显示在页面的特定部分 我们启动线程并等待 2 分钟 经过 2 分钟后 如果
  • 在 python 中绘制流数据的最轻量级方法

    为了让您了解我在寻找什么 它看起来像this http youtu be xMWIATas e0 t 1m37s 到目前为止 我已经使用 matplotlib 进行所有绘图 并且时间并不重要 它是在后处理中完成的 我想知道除了将数据向左移动
  • 以编程方式设置微调器文本颜色滞后、速度慢、瞬间颜色错误

    TLDR 我的微调器瞬间显示错误的颜色 我的旋转器有问题 每当我运行应用程序时 如果活动未缓存在内存中 它有时会滞后 在我可以将文本设置为正确的颜色之前 文本是默认颜色 如黑色 看起来确实很不专业 Video 请观看此屏幕录制以了解其实际效
  • 如何按第一个字符串对字符串对向量进行分组?

    我有一个包含字符串对的向量 vector
  • QAbstractTableModel::insertRows 将新数据附加到内部 QList

    我有以下类 它代表数据结构中的记录 ifndef UECONNECTEDCLIENTRECORD H define UECONNECTEDCLIENTRECORD H include