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

news/2024/5/13 17:53:21

参考:
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://www.mrgr.cn/p/33581560

相关文章

树莓派怎么设置固定IP地址

参考 https://blog.csdn.net/ByteBox/article/details/134752264 修改配置文件 /etc/dhcpcd.conf修改以下配置,其余配置保存不变 本次修改的是无线网卡wlan0 interface wlan0 static ip_address=192.168.4.212/24 static routers=192.168.4.1 static domain_name_servers=192.1…

蓝桥杯——分巧克力

思路非常简单&#xff0c;就是一个二分法。 注意一下l和r的取值&#xff0c;就可以了。 // 如何进行切分巧克力&#xff1a;横纵除法。例如&#xff1a;一块6*5的&#xff0c;欲切为3*3的小块&#xff0c;横&#xff1a;6/2 3&#xff1b;纵&#xff1a;5/31.所以可以切成3*…

为什么vue打印的对象在浏览器中显示...

1.现象当在vue中打印对象的时候会发现有一些属性或者全部属性都是显示的...,点击展开后才能看到真正的值是什么.2.原因因为在vue中对象都是用了代理重写了get,由于get重写也就导致了浏览器不能直接获取到具体的值,因此才会在打印的时候为...,手动点击展开才显示具体的值3.想看具…

Angular cli 组件和服务的创建, 父传子,子传父,服务的简单使用

1:Angular cli 创建组件componentng g component components\rightng g c wave 简写需要定位到根路径下即可创建组件Could not find an NgModule. Use the skip-import option to skip importing in NgModule. PS C:\myAngulrDemos\20240428demo\mydemo01\src> cd .. PS C…

R使用LASSO回归预测股票收益

原文链接:http://tecdat.cn/?p=4228 原文出处:拓端数据部落公众号使用LASSO预测收益 1.示例 只要有金融经济学家,金融经济学家一直在寻找能够预测股票收益的变量。对于最近的一些例子,想想Jegadeesh和Titman(1993),它表明股票的当前收益是由前几个月的股票收益预测的,…

SpringMVC深解--一起学习吧之架构

SpringMVC的工作原理主要基于请求驱动&#xff0c;它采用了前端控制器模式来进行设计。以下是SpringMVC工作原理的详细解释&#xff1a; 请求接收与分发&#xff1a; 当用户发送一个请求到Web服务器时&#xff0c;这个请求首先会被SpringMVC的前端控制器&#xff08;Dispatche…

C++面经(简洁版)

1. 谈谈C和C的认识 C在C的基础上添加类&#xff0c;C是一种结构化语言&#xff0c;它的重点在于数据结构和算法。C语言的设计首要考虑的是如何通过一个过程&#xff0c;对输入进行运算处理得到输出&#xff0c;而对C&#xff0c;首先要考虑的是如何构造一个对象&#xff0c;通…

PostgreSQL从小白到高手教程 - 第50讲:PG分区表管理

PostgreSQL从小白到专家,是从入门逐渐能力提升的一个系列教程,内容包括对PG基础的认知、包括安装使用、包括角色权限、包括维护管理、、等内容,希望对热爱PG、学习PG的同学们有帮助,欢迎持续关注CUUG PG技术大讲堂。第50讲:PG分区表管理内容1:数据分区 内容2:表继承 内容…

组件的使用、父子通信、ref属性(父子通信)、动态组件、 keep-alive、插槽

【组件的使用】1 <!DOCTYPE html>2 <html lang="en">3 <head>4 <meta charset="UTF-8">5 <title>Title</title>6 <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></scr…

openEuler操作系统安装OpenCV 3.4.10

安装依赖 JDK要求 需求java 17 系统要求 centos 8centos 7需要自行升级glibc到某个版本,哪一个忘记了,风险很大,不要尝试! 基础依赖 # 缺什么就下什么,其中cmake是最重要的 yum -y install epel-release yum install gcc gcc-c++ yum install cmake yum install epel-r…

2月起始的周数

问题:财政年度从2月起始,如何计算周数(假设每周从周一开始) 函数公式解决:=WEEKNUM(A2-31,2)

将游戏界面与注册/登录界面连接到一起

一、 导包 在注册页面中导入一个import subprocess包 二、 使用代码将其连接到一起 在循环中加入下面这一行代码&#xff0c;用来实现效果 subprocess.run(["python", "game代码.py"]

修改Ubuntu22.04系统图标

在Ubuntu 22.04中更改开机时显示的Ubuntu图标需要修改的设置。 主要思路是用自己图片替换系统图片&#xff0c;保持系统图片同名&#xff0c;同格式。 以下是一般的步骤&#xff1a; 修改启动界面的logo&#xff1a; sudo cp 新logo.png /usr/share/plymouth/themes/spinn…

探秘水资源:取水过程3D可视化技术的神奇之旅

取水过程3D可视化,就是通过先进的3D建模技术,将取水过程以立体的方式呈现在人们眼前。这不仅仅是一种视觉上的革新,更是一种对水资源管理方式的深刻变革。在科技飞速发展的今天,我们对世界的探索越来越深入,从微观粒子到宏观宇宙,从深海到高山,科技的力量让我们能够以前…

python多个txt合并

txt数据是这样: 内容: #!usr/bin/env python # -*- coding:utf-8 -*- """ @author: Suyue @file: lianxi.py @time: 2024/04/28 @desc: """ # -*- coding:utf-8 -*-# os模块中包含很多操作文件和目录的函数 import os# 适用于位置任意的情况,…

国密SDK编译

一、GMSSL-2.x 国密SDK源码下载,对GMSSL库进行编译生成对应的静态库。执行如下命令:cd到SDK源码目录 cd /Users/xxxx/Downloads/GMSSLV2-master查看SDK适用环境 ./config上图中错误解决方法 使用文本编辑器打开SDK目录下Configure、test/build.info、test/run_tests.pl。 use…

【Godot4.2】自定义富文本打印函数库 - myPrint

概述 Godot4.2提供print_rich()方法&#xff0c;可以在输出栏打印包含BBCode的富文本。但是显然直接用BBCode写有点费劲&#xff0c;所以自然而然想到封装函数库。 另外&#xff0c;输出栏也支持特殊字符输出&#xff0c;所以这也是一个字符的有为之地。另外还可以打印重复字…

详解Qt中实现树状结构图

在Qt中&#xff0c;实现树状结构图通常采用QTreeWidget或QTreeView组件。这两个组件都允许我们创建具有层次结构的列表&#xff0c;但它们之间存在一些差异。QTreeWidget提供了更简单的API&#xff0c;适用于轻量级、快速开发的需求&#xff1b;而QTreeView则更为灵活和可定制&…

【LLMOps】小白详细教程,在Dify中创建并使用自定义工具

文章目录 博客详细讲解视频点击查看高清脑图 1. 搭建天气查询http服务1.1. flask代码1.2. 接口优化方法 2. 生成openapi json schema2.1. 测试接口2.2. 生成openapi schema 3. 在dify中创建自定义工具3.1. 导入schema3.2. 设置工具认证信息3.3. 测试工具 4. 调用工具4.1. Agent…

Linux资源监控命令(系统资源占用top,磁盘使用情况df,网络状态监控sar)

top:系统资源占用 df:磁盘使用情况 sar:网络状态 top命令查看cpu,内存使用情况,类似Windows的任务处理器 退出命令:ctrl + c top命令内容详解1. PLD :进程id 2. USER :进程所属用户 3. PR :进程优先级,越小越高 4. NI :负值表示高优先级,正表示低优先级 …