QTableView 和 QAbstractTableModel

1.自定义类继承QAbstractTableModel

头文件如下:

#ifndef TESTMOUDLE_H
#define TESTMOUDLE_H
#include "StructTest.h"
#include <QAbstractTableModel>
 
class TestMoudle : public QAbstractTableModel
{
public:
    TestMoudle(QStringList& list, QObject *parent = nullptr);
    ~TestMoudle();
    void AddData(StructTest test);
    void DelData(int index );
public:
    virtual Qt::ItemFlags flags(const QModelIndex &index) const override;
    virtual int rowCount(const QModelIndex &parent = QModelIndex()) const override;
    virtual int columnCount(const QModelIndex &parent = QModelIndex()) const override;
    virtual bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override;
    virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
    virtual QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;
public:
    QList<StructTest> m_list;
    QStringList m_headList;
};
#endif // TESTMOUDLE_H

源文件

#include "TestMoudle.h"
 
 
TestMoudle::TestMoudle(QStringList& list, QObject *parent )
    : QAbstractTableModel(parent), m_headList(list)
{
}
 
TestMoudle::~TestMoudle()
{
 
}
 
 
Qt::ItemFlags TestMoudle::flags(const QModelIndex &index) const
{
    Qt::ItemFlags flags = QAbstractTableModel::flags(index);
    return flags|Qt::ItemIsEditable; //需要双击编辑 添加 Qt::ItemIsEditable
}
int TestMoudle::rowCount(const QModelIndex &parent) const
{
    Q_UNUSED(parent)
    return m_list.size();
}
int TestMoudle::columnCount(const QModelIndex &parent ) const
{
    Q_UNUSED(parent)
    return 2;
}
 
bool TestMoudle::setData(const QModelIndex &index, const QVariant &value, int role )
{
    if (!index.isValid())
        return false;
 
    if(role == Qt::EditRole)
    {
        int iRow = index.row(), iCol = index.column();
        if( iRow >= 0 && iRow < m_list.size() )
        {
            if(iCol == 0)
            {
                m_list[iRow].ID = value.toString();
            }
            else if(iCol == 1)
            {
                m_list[iRow].name = value.toString();
            }
        }
    }
 
    return true;
}
 
QVariant TestMoudle::data(const QModelIndex &index, int role ) const
{
    if (!index.isValid())
    {
        return QVariant();
    }
    switch (role)
    {
        case Qt::DisplayRole:
        case Qt::EditRole://不添加 双击编辑 原来的内容为空了
        {
            int row = index.row();
            if(row < 0 || row > m_list.size() )
                return QVariant();
            if(index.column()==0)
                return m_list[row].ID;
            else
                return m_list[row].name;
        }
        break;
        case Qt::TextAlignmentRole:
        {
            return QVariant(Qt::AlignCenter);
        }
        break;
        default:
            return QVariant();
    }
    return QVariant();
}
 
QVariant TestMoudle::headerData(int section, Qt::Orientation orientation, int role ) const
{
    if (role==Qt::TextAlignmentRole)
    {
        return QVariant(Qt::AlignCenter);
        if (section==0)
        {
            return QVariant(Qt::AlignCenter);
        }
        else
        {
            return QVariant(Qt::AlignVCenter|Qt::AlignLeft);
        }
    }
    else if (role==Qt::DisplayRole)
    {
        if( orientation==Qt::Horizontal )
        {
            if(  section>=0 && section < m_headList.size() )
                return m_headList.at(section);
        }
        else
           return  QString("%1").arg(section + 1);
    }
    return QAbstractTableModel::headerData(section,orientation,role);
}
 
 
void TestMoudle::AddData(StructTest test)
{
    beginResetModel();
    m_list << test;
    endResetModel();
}
 
void TestMoudle::DelData(int index )
{
    beginResetModel();
    m_list.removeAt(index);
    endResetModel();
}
//mainwidow.cpp
bool InitTableWidget( QTableView *pTableView, QStringList& list, bool bStretch, QList<int>& width, bool bVStretch, int hight)
{
    if( !bStretch && list.size() != width.size() )
        return false;
 
    pTableView->horizontalHeader()->setMinimumSectionSize(1);
 
    if( bStretch )
    {
        pTableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);//宽度自适应
        //pTableView->verticalHeader()->setSectionResizeMode(QHeaderView::Stretch);
    }
    else
    {
        for (int i=0;i< width.size();i++ ) {
            pTableView->setColumnWidth(i, width.at(i));
        }
    }
    pTableView->horizontalHeader()->setDefaultAlignment (Qt::AlignLeft | Qt::AlignVCenter);
    pTableView->setAlternatingRowColors(true);/* 行颜色交替显示 */
    if(bVStretch)
        pTableView->verticalHeader()->setSectionResizeMode(QHeaderView::Stretch);
    else
        pTableView->verticalHeader()->setDefaultSectionSize(hight);
    pTableView->setSelectionBehavior ( QAbstractItemView::SelectItems);
    //pTableView->setEditTriggers(QAbstractItemView::DoubleClicked);
    pTableView->verticalHeader()->setHidden( true );
    pTableView->setShowGrid(true);
    pTableView->setFocusPolicy(Qt::NoFocus);//隐藏选中虚线
    pTableView->horizontalHeader()->setHighlightSections(true);
    pTableView->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);
    return true;
}
 
 
void MainWindow::InitTable()
{
    QList<int> width;
    QStringList list;
    list << "ID" << "Name";
    m_pMoude = new TestMoudle(list);
    ui->tableView->setModel(m_pMoude);
    QAbstractItemView::EditTriggers xx = ui->tableView->editTriggers();
    InitTableWidget( ui->tableView, list, true,  width, false, 30);
    //ui->tableView->setEditTriggers(QAbstractItemView::CurrentChanged);
    //ui->tableView->setEditTriggers(QAbstractItemView::DoubleClicked);
   // connect(ui->tableView, &QTableView::doubleClicked, this, &MainWindow::slotRowDoubleClicked);
}
 
//添加
void MainWindow::on_pushButton_clicked()
{
    int row = m_pMoude->rowCount();
    StructTest test;
    test.ID = QString("ID %1").arg(row+1);
    test.name = QString("name %1").arg(row+1);
    m_pMoude->AddData(test);
}
 
 
//删除
void MainWindow::on_pushButton_2_clicked()
{
    QModelIndex index = ui->tableView->selectionModel()->currentIndex();
    int currentRow = index.row();
    if( currentRow < 0)
    {
        return;
    }
    m_pMoude->DelData(currentRow);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/160130.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何一次性解压多个文件

第一步&#xff1a;多选压缩包 第二步&#xff1a;右键解压即可 一句话&#xff0c;单个怎么解压&#xff0c;多个就怎么解压&#xff0c;只不过先选中 参考&#xff1a;如何一次性解压多个文件

智能安全帽作业记录仪赋能智慧工地人脸识别劳务实名制

需求背景 建筑工地是一个安全事故多发的场所。目前&#xff0c;工程建设规模不断扩大&#xff0c;工艺流程纷繁复杂&#xff0c;如何完善现场施工现场管理&#xff0c;控制事故发生频率&#xff0c;保障文明施工一直是施工企业、政府管理部门关注的焦点。尤其随着社会的不断进…

YARN,ZOOKEERPER--学习笔记

1&#xff0c;YARN组件 1.1YARN简介 YARN表示分布式资源调度&#xff0c;简单地说&#xff0c;就是&#xff1a;以分布式技术完成资源的合理分配&#xff0c;让MapReduce能高效完成计算任务。 YARN是Hadoop核心组件之一&#xff0c;用于提供分布式资源调度服务。 而在Hadoop …

逻辑漏洞(业务逻辑)dami CMS

逻辑漏洞&#xff08;业务支付逻辑漏洞&#xff09;dami CMS 0x01 业务逻辑简介 业务逻辑指的是一个系统或应用程序中的实际业务规则和流程。它描述了如何处理特定的业务需求、数据和操作。业务逻辑通常是根据特定行业或组织的需求而设计的。 在软件开发中&#xff0c;业务逻…

零编程基础Python的全面学习指南

文章目录 前言什么是编程&#xff1f;Python代码对应的机器码准备开始Windows变量类型整型字符串型布尔类型字符串连接和整数相加if 语句捕获用户输入导入MacWindows游戏时间&#xff01;小结关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Pyt…

磐舟CI使用说明及案例

整体介绍 磐舟作为一个devops产品&#xff0c;它具备基础的CI流水线功能。同时磐舟的流水线是完全基于云原生架构设计的&#xff0c;在使用时会有一些注意事项。这里首先我们要了解磐舟整体的流水线打包逻辑。 文档结构说明 一般来说&#xff0c;磐舟推荐单个业务的标准git库…

反编译-ApkTool

ApkTool下载地址&#xff1a; Apktool | ApktoolA tool for reverse engineering Android apk fileshttps://apktool.org/ 1、使用 apktool 解包 执行 java -jar apktool_2.4.1.jar d demo.apk -o demo 命令 java -jar apktool_2.4.1.jar d demo.apk -o demo 其中 d 后面是…

Nevron Vision for .NET 2023.1 Crack

Nevron Vision for .NET 适用于桌面和 Web 应用程序的高级数据可视化 Nevron Vision for .NET提供最全面的组件&#xff0c;用于构建面向 Web 和桌面的企业级数据可视化应用程序。 该套件中的组件具有连贯的 2D 和 3D 数据可视化效果&#xff0c;对观众产生巨大的视觉冲击力。我…

基于window10的远程桌面报错:要求的函数不受支持 的问题解决方法

基于window10的远程桌面报错&#xff1a;要求的函数不受支持 的问题解决方法 设置方法&#xff1a; 一、WINR 在框内输入gpedit.msc 二、依次打开 计算机配置----管理模板-----系统—凭据分配—加密数据库修正–改为以启用—易受攻击 第一步&#xff1a; 第二步&#xff1a;…

并查集总结

并查集简介 并查集是一种可以动态维护若干个不重叠的结合&#xff0c;并支持合并与查询的数据结构 并查集是一种树状的数据结构&#xff0c;可以用于维护传递关系以及联通性。 并查集有两种操作&#xff1a; find&#xff1a;查询一个元素属于哪个集合merge:合并两个集合 模…

爆款文章有诀窍,内容创作者如何能持续产出优质内容

内容营销人有没有这么一种共鸣&#xff1a;10 万 那么多&#xff0c;为什么不能多我一个&#xff1f; 通常&#xff0c;我们把浏览量 / 阅读量高、转评赞数量高的内容看作爆款&#xff0c;而数据如果达到 10 万 则是超级爆款。因为&#xff0c;阅读量高意味着内容得到了大量的曝…

【Linux】使用Makefile自动化编译项目:简化开发流程、提高效率

文章目录 示例一&#xff1a;编译一个进度条程序示例二&#xff1a;编译一个简单的程序gcc的几个选项结论 当你开始一个新的软件项目时&#xff0c;编写一个好的Makefile是非常重要的。Makefile是一个文本文件&#xff0c;用于指定如何构建和编译项目。它定义了目标文件、依赖关…

8年老鸟整理,自动化测试-准备测试数据详细...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 大部分类型的测试…

基于C#实现Bitmap算法

在所有具有性能优化的数据结构中&#xff0c;我想大家使用最多的就是 hash 表&#xff0c;是的&#xff0c;在具有定位查找上具有 O(1)的常量时间&#xff0c;多么的简洁优美&#xff0c;但是在特定的场合下&#xff1a; ①&#xff1a;对 10 亿个不重复的整数进行排序。 ②&am…

python获取透明图

import cv2 import os import numpy as nproot "./test" for file in os.listdir(root):# 读取图片image cv2.imread(os.path.join(root, file), cv2.IMREAD_UNCHANGED)new np.zeros((image.shape[0], image.shape[1], image.shape[2]), np.uint8)# 检查图片是否为…

AI原生应用为百度带来新增量

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; AI将彻底改变每一个行业!得益于AI和基础模型的驱动&#xff0c;百度在AI原生应用领域厚积薄发。 11月21日&#xff0c;百度Q3财报发布&#xff0c;数据显示&#xff1a;三季度营收达344.47亿元&…

Redis篇---第九篇

系列文章目录 文章目录 系列文章目录前言一、如果有大量的 key 需要设置同一时间过期,一般需要注意什么?二、什么情况下可能会导致 Redis 阻塞?三、缓存和数据库谁先更新呢?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击…

Axios简单使用与配置安装-Vue

安装Axios npm i axios main.js 导入 import Axios from axios Vue.prototype.$axios Axios简单发送请求 get getTest() {this.$axios({method: GET,url: https://apis.jxcxin.cn/api/title?urlhttps://apis.jxcxin.cn/}).then(res > {//请求成功回调console.log(res)}…

uiautomator2快速入门app自动化测试教程

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、环境准备1.安装软件2.安装库 二、adb 连接手机1. 准备工作2. 第一种连接方式&#xff1a;USB连接3. 第二种连接方式&#xff1a;WLAN连接4. 第三种连接方式…