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 的相关文章

  • 删除文件的最后 10 个字符

    我想删除文件的最后 10 个字符 说一个字符串 hello i am a c learner 是文件内的数据 我只是希望该文件是 hello i am a 文件的最后 10 个字符 即字符串 c learner 应在文件内消除 解决方案 将
  • BASIC 中的 C 语言中的 PeekInt、PokeInt、Peek、Poke 等效项

    我想知道该命令的等效项是什么Peek and Poke 基本和其他变体 用 C 语言 类似PeekInt PokeInt 整数 涉及内存条的东西 我知道在 C 语言中有很多方法可以做到这一点 我正在尝试将基本程序移植到 C 语言 这只是使用
  • C# 异步等待澄清?

    我读了here http blog stephencleary com 2012 02 async and await html that 等待检查等待的看看它是否有already完全的 如果 可等待已经完成 那么该方法将继续 运行 同步
  • 在一个数据访问层中处理多个连接字符串

    我有一个有趣的困境 我目前有一个数据访问层 它必须与多个域一起使用 并且每个域都有多个数据库存储库 具体取决于所调用的存储过程 目前 我只需使用 SWITCH 语句来确定应用程序正在运行的计算机 并从 Web config 返回适当的连接字
  • 机器Epsilon精度差异

    我正在尝试计算 C 中双精度数和浮点数的机器 epsilon 值 作为学校作业的一部分 我在 Windows 7 64 位中使用 Cygwin 代码如下 include
  • 从经典 ASP 调用 .Net C# DLL 方法

    我正在开发一个经典的 asp 项目 该项目需要将字符串发送到 DLL DLL 会将其序列化并发送到 Zebra 热敏打印机 我已经构建了我的 DLL 并使用它注册了regasm其次是 代码库这使得 IIS 能够识别它 虽然我可以设置我的对象
  • 无限循环与无限递归。两者都是未定义的吗?

    无副作用的无限循环是未定义的行为 看here https coliru stacked crooked com view id 24e0a58778f67cd4举个例子参考参数 https en cppreference com w cpp
  • 方程“a + bx = c + dy”的积分解

    在等式中a bx c dy 所有变量都是整数 a b c and d是已知的 我如何找到整体解决方案x and y 如果我的想法是正确的 将会有无限多个解 由最小公倍数分隔b and d 但我只需要一个解决方案 我可以计算其余的 这是一个例
  • 两个静态变量同名(两个不同的文件),并在任何其他文件中 extern 其中一个

    在一个文件中将变量声明为 static 并在另一个文件中进行 extern 声明 我认为这会在链接时出现错误 因为 extern 变量不会在任何对象中看到 因为在其他文件中声明的变量带有限定符 static 但不知何故 链接器 瑞萨 没有显
  • WcfSvcHost 的跨域异常

    对于另一个跨域问题 我深表歉意 我一整天都在与这个问题作斗争 现在已经到了沸腾的地步 我有一个 Silverlight 应用程序项目 SLApp1 一个用于托管 Silverlight SLApp1 Web 的 Web 项目和 WCF 项目
  • x:将 ViewModel 方法绑定到 DataTemplate 内的事件

    我基本上问同样的问题这个人 https stackoverflow com questions 10752448 binding to viewmodels property from a template 但在较新的背景下x Bind V
  • C# xml序列化必填字段

    我需要将一些字段标记为需要写入 XML 文件 但没有成功 我有一个包含约 30 个属性的配置类 这就是为什么我不能像这样封装所有属性 public string SomeProp get return someProp set if som
  • 复制目录下所有文件

    如何将一个目录中的所有内容复制到另一个目录而不循环遍历每个文件 你不能 两者都不Directory http msdn microsoft com en us library system io directory aspx nor Dir
  • 有没有办法让 doxygen 自动处理未记录的 C 代码?

    通常它会忽略未记录的 C 文件 但我想测试 Callgraph 功能 例如 您知道在不更改 C 文件的情况下解决此问题的方法吗 设置变量EXTRACT ALL YES在你的 Doxyfile 中
  • C++ 继承的内存布局

    如果我有两个类 一个类继承另一个类 并且子类仅包含函数 那么这两个类的内存布局是否相同 e g class Base int a b c class Derived public Base only functions 我读过编译器无法对数
  • 为什么C++代码执行速度比java慢?

    我最近用 Java 编写了一个计算密集型算法 然后将其翻译为 C 令我惊讶的是 C 的执行速度要慢得多 我现在已经编写了一个更短的 Java 测试程序和一个相应的 C 程序 见下文 我的原始代码具有大量数组访问功能 测试代码也是如此 C 的
  • C# 中最小化字符串长度

    我想减少字符串的长度 喜欢 这串 string foo Lorem ipsum dolor sit amet consectetur adipiscing elit Aenean in vehicula nulla Phasellus li
  • DotNetZip:如何提取文件,但忽略zip文件中的路径?

    尝试将文件提取到给定文件夹 忽略 zip 文件中的路径 但似乎没有办法 考虑到其中实现的所有其他好东西 这似乎是一个相当基本的要求 我缺少什么 代码是 using Ionic Zip ZipFile zf Ionic Zip ZipFile
  • 在OpenGL中,我可以在坐标(5, 5)处精确地绘制一个像素吗?

    我所说的 5 5 正是指第五行第五列 我发现使用屏幕坐标来绘制东西非常困难 OpenGL 中的所有坐标都是相对的 通常范围从 1 0 到 1 0 为什么阻止程序员使用屏幕坐标 窗口坐标如此严重 最简单的方法可能是通过以下方式设置投影以匹配渲
  • 类型或命名空间“MyNamespace”不存在等

    我有通常的类型或命名空间名称不存在错误 除了我引用了程序集 using 语句没有显示为不正确 并且我引用的类是公共的 事实上 我在不同的解决方案中引用并使用相同的程序集来执行相同的操作 并且效果很好 顺便说一句 这是VS2010 有人有什么

随机推荐

  • 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