qt5-入门-自定义委托-可编辑的TableModel与信号接收

参考:
C++ GUI Programming with Qt 4, Second Edition

本地环境:
win10专业版,64位,Qt5.12

上一篇:
qt5-入门-自定义委托-简单例子_qt 委托-CSDN博客
https://blog.csdn.net/pxy7896/article/details/137234839


本篇重点在于接收信号。Model做了一点点改动。

效果

每个item都是可以编辑的字符串。
在这里插入图片描述
编辑之后,输出编辑的位置以及改动后的值(前两个数字是row index和column index,第三个是更改后的值)。
在这里插入图片描述

实现

自定义model

class CustomTableModel : public QAbstractTableModel
{Q_OBJECT
public:explicit CustomTableModel(QObject* parent = nullptr): QAbstractTableModel(parent){// 初始化数据//m_data << 1 << 2 << 3 << 4 << 5;}void setData(QStringList other) {this->m_data = other;}QStringList getData() {return  this->m_data;}QVariant headerData(int section, Qt::Orientation orientation, int role) const override{if (role == Qt::DisplayRole){// 这个相当于将行名和列名设置为“”,实际仍然占据空间// 如果要完全隐藏需要用setVisible(false),参见最后1节return QVariant();/*if (orientation == Qt::Horizontal){return QVariant(); // 返回空的QVariant,不显示列名}else{return QVariant(); // 返回空的QVariant,不显示行名}*/}return QAbstractTableModel::headerData(section, orientation, role);}int rowCount(const QModelIndex& parent = QModelIndex()) const override{return m_data.size();}int columnCount(const QModelIndex& parent = QModelIndex()) const override{return 1;}QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override{if (!index.isValid())return QVariant();if (role == Qt::DisplayRole) {return m_data.at(index.row());}return QVariant();}Qt::ItemFlags flags(const QModelIndex& index) const override{if (!index.isValid())return Qt::NoItemFlags;return Qt::ItemIsEditable | QAbstractTableModel::flags(index);}bool setData(const QModelIndex& index, const QVariant& value, int role = Qt::EditRole) override{if (index.isValid() && role == Qt::EditRole) {m_data.replace(index.row(), value.toString());// 这里发出信号了emit dataChanged(index, index);return true;}return false;}private:QStringList m_data;
};

自定义delegate

class EditableListItemDelegate : public QStyledItemDelegate
{
public:EditableListItemDelegate(QObject *parent = nullptr) : QStyledItemDelegate(parent) {}QSize sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index) const override{return QStyledItemDelegate::sizeHint(option, index);}void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const override{QStyledItemDelegate::paint(painter, option, index);}// 创建编辑器QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override{QLineEdit *editor = new QLineEdit(parent);return editor;}// 设置编辑器内容void setEditorData(QWidget *editor, const QModelIndex &index) const override{QLineEdit *lineEdit = static_cast<QLineEdit*>(editor);lineEdit->setText(index.model()->data(index).toString());}// 获取并设置更新后的文本到Modelvoid setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override{QLineEdit *lineEdit = qobject_cast<QLineEdit*>(editor);model->setData(index, lineEdit->text(), Qt::EditRole);}void updateEditorGeometry(QWidget* editor, const QStyleOptionViewItem& option, const QModelIndex& index) const override{editor->setGeometry(option.rect);}
};

使用

注意:这里的隐藏是指完全隐藏,并非只隐藏内容。

QTableView* tableView = new QTableView;
// 隐藏列名列
tableView->horizontalHeader()->setVisible(false);
// 隐藏行号列 
tableView->verticalHeader()->setVisible(false); // 设置代理
EditableListItemDelegate* delegate = new EditableListItemDelegate;
tableView->setItemDelegate(delegate);// 设置数据
CustomTableModel* model = new CustomTableModel;
model->setData({"1", "2"});
tableView->setModel(model);// 信号接收
QObject::connect(model, &CustomTableModel::dataChanged, [](const QModelIndex &topLeft, const QModelIndex &bottomRight) {qDebug() << "Data changed in model:" << topLeft.row() << topLeft.column() << "-" << bottomRight.data().toString() << endl;
});tableView->show();

done.

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

编写你的第一个java 程序

1.安装 jdk 网址&#xff1a; Java Downloads | Oracle 一般我们安装jdk 17 就行了 自己练习 自己学习 真正的开发中我们使用jdk 8 这个是最适合开发java 应用程序的 当然你也可以选择你的 系统 来安装这个java 在文件资源管理器打开JDK的安装目录的bin目录&#xff0c;会发…

通义千问(Qwen)AI大模型-系列_2

一、通义千问系列模型 1、CodeQwen1.5-7B-Chat CodeQwen1.5是Qwen1.5的代码特定版本。它是一种基于变换器的纯解码器语言模型&#xff0c;在大量代码数据上进行预训练。 强大的代码生成能力和在一系列基准测试中具有竞争力的性能;支持长上下文理解和生成&#xff0c;上下文长度…

【FX110网】股市、汇市一年有多少个交易日?

事实上&#xff0c;作为交易者&#xff0c;重要的是要了解并非每天都是交易日。虽然金融市场在大多数工作日开放交易&#xff0c;但在某些特定情况下无法进行交易。这些非交易日可能因各种原因而发生&#xff0c;包括节假日、周末和市场休市。 通过随时了解假期、交易时间表和市…

逆数对(树状数组的方法)

本题链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 题目&#xff1a; 样例&#xff1a; 输入 5 4 5 1 3 2 输出 7 思路&#xff1a; 根据题意&#xff0c;求逆序对总数。 逆序对含义&#xff1a;如果数组中的两个不同位置&#xff0c;前面的数字比后面的数字严格大&…

混沌工程理论建设和项目实践

混沌工程理论建设和项目实践 1. 背景说明2. 为什么要做混沌工程2.1 混沌目标2.2 演习对象2.3 影响可用性的主要因素及应对2.4 可行性论证和控制爆炸半径 3. 如何落地3.1 安全、有效的实验3.2 安全&#xff1a;不影响线上业务3.2.1 爆炸半径3.2.2 特殊限制与审批 3.3 有效&#…

使用BibTeX导入参考文献到Overleaf项目(常用方法)

使用bib为overleaf导入参考文献的好处 整洁的管理&#xff1a; 使用 .bib 文件可以使你的参考文献管理更加整洁和有条理。你可以将所有的参考文献集中存储在一个文件中&#xff0c;而不是在文档中直接引用或复制粘贴。 易于维护和更新&#xff1a; 当你需要添加、删除或修改参考…

WEB攻防-ASP中间件IIS文件上传解析安全漏洞

漏洞原理&#xff1a; 基于文件 IIS6.0默认不解析;号后面的内容&#xff0c;例如1.asp;.jpg会当成1.asp解析&#xff0c;相当于分号截断。 基于文件夹 IIS6.0会将/*.asp/文件夹下的文件当成asp解析。 案例&#xff1a; 写一个木马文件&#xff0c;并改为jpg后缀 GIF89agif8…

报名 | Qt汽车及工业行业解决方案及实战训练 深圳站(5月15日 星期三)

加入我们的Qt技术培训&#xff0c;探索跨平台应用开发的无限可能&#xff01;本次培训将深入Qt框架&#xff0c;涵盖从基础概念到高级功能的全方位知识&#xff0c;无论您是刚入门的新手还是希望提升技能的资深开发者&#xff0c;都能在此找到适合自己的学习路径。通过实践案例…

python学习笔记(集合)

知识点思维导图 # 直接使用{}进行创建 s{10,20,30,40} print(s)# 使用内置函数set()创建 sset() print(s)# 创建一个空的{}默认是字典类型 s{} print(s,type(s))sset(helloworld) print(s) sset([10,20,30]) print(s) s1set(range(1,10)) print(s1)print(max:,max(s1)) print(m…

OceanBase 开发者大会 - 见闻与洞察

文章目录 前言主论坛见闻技术专场见闻产品技术专场技术生态专场 同行论道启发互动展区写在最后 前言 4 月 20 日&#xff0c;我有幸受邀参加了第二届 OceanBase 开发者大会。 50 余位业界知名数据库大咖和数据库爱好者&#xff0c;与来自全国近 600 名开发者相聚。共同探讨一体…

【01-机器学习入门:理解Scikit-learn与Python的关系】

文章目录 前言Python与机器学习Scikit-learn简介Scikit-learn与Python的关系使用Scikit-learn进行机器学习结语前言 在当今的数据科学和人工智能领域,机器学习已经成为了一个不可或缺的组成部分。而对于那些刚刚踏入这一领域的新手来说,理解机器学习的基本概念和找到合适的工…

Security初探(二)

SpringSecurity初探(一)-CSDN博客 上面介绍了用了在SpringBoot里配置UserDetailsService和PasswordEncoder两个Bean 下面介绍一种替换掉上面两个Bean的方式 看下效果实际是和创建UserDetailsService和PassswordEncoder两个Bean的效果是一样的 还有一种方式混合搭配 当然不推…

【C语言__指针01__复习篇11】

目录 前言 一、什么是指针 二、计算机中常见的单位 三、CPU是怎样找到一块内存空间的 四、如何得到变量的地址 五、指针变量 六、解引用指针变量的作用 七、指针变量的大小 八、指针变量类型的意义 8.1 指针的解引用 8.2 指针-整数 九、void*指针 十、const修饰变…

【算法学习】线段树基础版

一 线段树 1.概念 线段树可以理解为一个二叉树&#xff0c;如果是利用线段树求区间的和&#xff0c;那么每个结点的权值维护的是结点所维护区间的和&#xff0c;再将该区间一分为二&#xff0c;分别交由左右儿子维护。 拿区间1 - 4的和来举例子&#xff0c; 根结点维护的是区…

开发简易复用 SDK(项目加分项)

文章目录 开发 SDK新建项目修改pom文件删除启动类创建配置类复制之前的客户端新建spring.factories打包 开发 SDK 为什么要开发SDK。 减少代码的冗余提高代码的复用 如果实际项目中需要使用到该SDK&#xff0c;在pom.xml中注入就可以了。 类似于maven一样&#xff0c;把需要…

ctfshow——XSS

文章目录 XSS介绍什么是xss&#xff1f;XSS危害XSS的分类常用XSSpayload web316——反射型XSSweb317——过滤<script> web318——过滤script、imgweb319——不止过滤script、imgweb320——过滤空格web321——不止过滤空格web322——不止过滤空格web323web324web 325web32…

618买什么最划算?618买什么东西便宜?必备数码好物清单分享

​只不&#xff0c;马上又到了618购物节咯&#xff0c;数码产品的优惠力度尤为显著&#xff0c;是购买数码产品的绝佳时机。接下来&#xff0c;我将为大家分享几款性价比超高的数码产品&#xff0c;相信总有一款能吸引你的目光。 一、南卡OE MIX开放式蓝牙耳机 在618购物狂欢节…

深兰科技入选2024全国“人工智能+”行动创新案例TOP100

近日&#xff0c;中科院《互联网周刊》联合eNET研究院、德本咨询、中国社会科学院信息化研究中心共同发布了《2024全国“人工智能”行动创新案例TOP100》榜单。经评委会层层遴选&#xff0c;深兰科技专为洛阳市打造的“工业智能化洛阳中心”项目成功入围该榜单。一同入围的还包…

IP-guard getdatarecord 存在任意文件读取

声明 本文仅用于技术交流&#xff0c;请勿用于非法用途 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;文章作者不为此承担任何责任。 一、产品介绍 IP-guard是由溢信科技股份有限公司开发的一款终端安全管…

案例:SpringBoot集成Sharding-JDBC实现分表分库与主从同步(详细版)

案例&#xff1a;SpringBoot集成Sharding-JDBC实现分表分库与主从同步&#xff1a;详细版 1. 案例分析2. 主从同步2.1 主从数据库准备2.2 简单插点数据 3 案例代码3.1 application.properties配置信息3.2 测试 4. 遇到的坑4.1 水平分表时的属性设置4.2 绑定表的配置 1. 案例分析…