一、概述

功能: 实现一个查询学生信息的表格,有学号、性别、年龄、班级和分数共5列,针对最后一列分数实现委托代理,要求能编辑和查看该分数列。

QTableView实现视图展示ui

Model负责数据的构造

Delegate是委托,可针对某列数据做自定义扩展

使用的qt控件如下:

  • QTableView
  • StudentTableModel继承自QAbstractTableModel
  • ScoreDelegate继承自QStyledItemDelegate

二、具体代码

studenttablemodel.h

#ifndef STUDENTTABLEMODEL_H
#define STUDENTTABLEMODEL_H#include <QAbstractTableModel>
#include <QObject>class StudentTableModel : public QAbstractTableModel
{Q_OBJECT
public:explicit StudentTableModel(QObject *parent = nullptr);int rowCount(const QModelIndex &parent = QModelIndex()) const override;int columnCount(const QModelIndex &parent = QModelIndex()) const override;QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;QVariant headerData(int section, Qt::Orientation orientation,int role = Qt::DisplayRole) const override;bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override;Qt::ItemFlags flags(const QModelIndex &index) const override;private:QVector<QVector<QVariant>> m_data; // 数据存储
};#endif // STUDENTTABLEMODEL_H

studenttablemodel.cpp

#include "studenttablemodel.h"StudentTableModel::StudentTableModel(QObject *parent): QAbstractTableModel{parent}
{// 初始化示例数据m_data = {{"1001", "male", 18, "class_01", 85},{"1002", "female", 19, "class_02", 92},{"1003", "male", 20, "class_03", 78}};
}int StudentTableModel::rowCount(const QModelIndex &parent) const
{Q_UNUSED(parent);return m_data.size();
}int StudentTableModel::columnCount(const QModelIndex &parent) const
{Q_UNUSED(parent);return 5; // 学号、性别、年龄、班级、分数
}QVariant StudentTableModel::data(const QModelIndex &index, int role) const
{if(!index.isValid()) return QVariant();if (role == Qt::DisplayRole || role == Qt::EditRole) {return m_data[index.row()][index.column()];}return QVariant();
}QVariant StudentTableModel::headerData(int section, Qt::Orientation orientation, int role) const
{if (role == Qt::DisplayRole && orientation == Qt::Horizontal) {switch (section) {case 0: return "id";case 1: return "sex";case 2: return "age";case 3: return "class";case 4: return "score";}}return QVariant();
}bool StudentTableModel::setData(const QModelIndex &index, const QVariant &value, int role)
{if (role == Qt::EditRole && index.isValid()) {m_data[index.row()][index.column()] = value;emit dataChanged(index, index); // 通知视图更新return true;}return false;
}Qt::ItemFlags StudentTableModel::flags(const QModelIndex &index) const
{auto flags = QAbstractTableModel::flags(index);if (index.column() == 4) // 分数列可编辑flags |= Qt::ItemIsEditable;return flags;
}

scoredelegate.h

#ifndef SCOREDELEGATE_H
#define SCOREDELEGATE_H#include <QObject>
#include <QStyledItemDelegate>class ScoreDelegate : public QStyledItemDelegate
{Q_OBJECT
public:explicit ScoreDelegate(QObject *parent = nullptr);QWidget *createEditor(QWidget *parent,const QStyleOptionViewItem &option,const QModelIndex &index) const override;void setEditorData(QWidget *editor, const QModelIndex &index) const override;void setModelData(QWidget *editor,QAbstractItemModel *model,const QModelIndex &index) const override;
};#endif // SCOREDELEGATE_H
#include "scoredelegate.h"#include <QSpinBox>ScoreDelegate::ScoreDelegate(QObject *parent): QStyledItemDelegate{parent}
{}QWidget *ScoreDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
{if (index.column() == 4) { // 仅对分数列生效QSpinBox *editor = new QSpinBox(parent);editor->setRange(0, 100);editor->setFrame(false);return editor;}return QStyledItemDelegate::createEditor(parent, option, index);
}void ScoreDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{if (index.column() == 4) {int value = index.model()->data(index, Qt::EditRole).toInt();QSpinBox *spinBox = qobject_cast<QSpinBox*>(editor);spinBox->setValue(value);} else {QStyledItemDelegate::setEditorData(editor, index);}
}void ScoreDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{if (index.column() == 4) {QSpinBox *spinBox = qobject_cast<QSpinBox*>(editor);spinBox->interpretText();model->setData(index, spinBox->value());} else {QStyledItemDelegate::setModelData(editor, model, index);}
}

widget.cpp

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);model = new StudentTableModel(this);scoreDelegate = new ScoreDelegate(this);ui->tableView->setModel(this->model);ui->tableView->setItemDelegateForColumn(4, scoreDelegate);// 表格样式设置ui->tableView->verticalHeader()->hide();ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);ui->tableView->setEditTriggers(QAbstractItemView::DoubleClicked | QAbstractItemView::SelectedClicked);//手动设置show显示ui->tableView->show();
}

三、遇到问题总结

1、QTableView展示不出来,model+tableview为局部变量

 当构造函数执行结束时,这两个对象会被自动销毁。即使调用了 tableView.show(),窗口会短暂显示,但对象销毁后视图也随之消失,因此实际看不到表格

    解决方案​:
将 tableView 和 model ​提升为类的成员变量,确保其生命周期与窗口一致:

2、 ​视图未嵌入父窗口布局

问题分析​:

  • 即使解决了生命周期问题,若 tableView 未添加到窗口布局中,它可能因尺寸为0或位置错误而不可见。
  • 你的代码中 tableView 是独立创建的,未关联到 ui 生成的界面布局中。

解决方案​:
将 tableView 添加到窗口的布局管理器中(例如使用 QVBoxLayout):

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

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

相关文章

用latex+vscode写论文

文章目录 前言 一、下载texlive安装包 二、安装texlive 1.安装 2.配置环境变量 3.检查是否安装成功 三、安装vscode 四、vscode中安装latex workshop插件 五、创建latex文档 六、撰写+编译+预览 七、latex workshop常用设置 1.打开设置页面 2.设置自动保存代码 3.设置自动编译代…

监测预警系统:让园区更高效、更安全、更智能

随着城市化进程的加快和产业集聚效应的凸显&#xff0c;园区作为经济发展的重要载体&#xff0c;其规模不断扩大&#xff0c;功能日益复杂。在这一背景下&#xff0c;传统的园区管理模式已难以满足现代园区高效、安全、智能的运营需求。园区监测预警系统作为一种集成了物联网、…

分享一个AutoOff定时动作软件

我们平时在使用电脑的时候有很多需求的功能&#xff0c;比如定时打开程序、定时关闭程序、定时休眠、定时关机等等。如果你也有这样的需求&#xff0c;那么就需要今天这款软件。AutoOff定时动作软件AutoOff这个软件是一款定时的软件&#xff0c;软件大小只有1.1M&#xff0c;而…

RPA软件推荐:提升企业自动化效率

在数字化转型浪潮中&#xff0c;机器人流程自动化&#xff08;RPA&#xff09;已成为企业降本增效的核心工具。它通过模拟人类操作&#xff0c;自动化重复性任务&#xff0c;如数据录入、报表生成和系统集成&#xff0c;显著提升运营效率。面对众多RPA软件&#xff0c;如何选择…

【Qt】QTime::toString(“hh:mm:ss.zzz“) 显示乱码的原因与解决方案

在使用 Qt 编写计时器程序时&#xff0c;我遇到一个很奇怪的问题&#xff1a;使用 QTime::toString("hh:mm:ss.zzz") 格式化时间后&#xff0c;显示出来的是一串乱码&#xff0c;如下所示&#xff1a;本来应该是&#xff1a;但却显示了一堆“〇”或奇怪的符号。问题表…

MSVC编译KDChart过程

MSVC编译KDChart过程 一、下载KDChart源文件 GitHub源文件 查看文件夹里的INSTALL.txt&#xff0c;可以看到需要CMake编译。 中文版 以下是使用 CMake 构建系统安装 KD Chart 的说明。 需要 CMake 3.3 或更高版本。Qt 版本支持&#xff1a;* KD Chart 2.5.0 及以下版本需要…

AI Agent管理后台原型设计全拆解(附3套可复用素材)

最近在做AI方向的产品&#xff0c;越来越能感受到“智能体”这个概念正在从技术圈走向应用层。无论是内部探索项目&#xff0c;还是外部合作需求&#xff0c;很多场景都会提到Agent、助手、知识库这些关键词。我们经常讨论如何打造一个有用的AI Agent&#xff0c;但实际上&…

ABP VNext + Elastic APM:微服务性能监控

ABP VNext Elastic APM&#xff1a;微服务性能监控 &#x1f680; &#x1f4da;目录ABP VNext Elastic APM&#xff1a;微服务性能监控 &#x1f680;一、引言 ✨架构全景图 &#x1f3d7;️二、环境与依赖 &#x1f4e6;三、APM 服务器与 Kibana 快速部署 &#x1f433;Doc…

单片机学习笔记.AD/DA(略含有SPI,用的是普中开发板上的XPT2046芯片)

AD/DA基础知识 硬件电路&#xff1a; 模电运放知识回顾&#xff1a; 虚短&#xff08;Virtual Short&#xff09;定义&#xff1a;运放同相输入端&#xff08;&#xff09;和反相输入端&#xff08;-&#xff09;的电位近似相等&#xff0c;即V V-&#xff0c;仿佛两个输入端短…

避坑指南:VMware安装CentOS常见错误及完美解决方案

1. 引言 虚拟机允许在同一台机子上有不同的操作系统&#xff0c;还可以用于搭建实验环境、软件测试和兼容性测试等。我是主攻大数据方向的会用到Linux操作系统&#xff0c;所以虚拟机对我来说是很有必要的。我把之前的笔记和安装包整理了一下&#xff0c;就有了现在这个教程。…

Python爬虫04_Requests豆瓣电影爬取

一、 爬取豆瓣电影排行榜数据 import requests import json url ‘https://movie.douban.com/j/chart/top_list’ param { ‘type’:‘24’, ‘interval_id’:‘100:90’, ‘action’:‘’, ‘start’:‘0’, #从库中的第几部电影去取 ‘limit’:‘20’, } headers { ‘Use…

工业物联网模块运营指南​

一、运营目标 工业物联网模块运营的核心目标在于通过高效运作,实现提高工业设备运行效率、降低生产成本、推动生产过程智能化管理,进而提升企业的整体竞争力。这一目标是后续所有运营工作的出发点和落脚点,为各项运营环节提供方向指引。 二、关键运营环节及做法 (一)设…

9.项目起步(3)

1项目起步-静态资源初始化 和 Error Lens 安装图片资源和样式资源error lens 安装2项目起步-scss文件自动导入为什么要自动导入自动导入配置scss变量自动导入$xtxColor: #27ba9b; $helpColor: #e26237; $sucColor: #1dc779; $warnColor: #ffb302; $priceColor: #cf4444;css: {p…

MCP提示词工程:上下文注入的艺术与科学

MCP提示词工程&#xff1a;上下文注入的艺术与科学 &#x1f31f; Hello&#xff0c;我是摘星&#xff01; &#x1f308; 在彩虹般绚烂的技术栈中&#xff0c;我是那个永不停歇的色彩收集者。 &#x1f98b; 每一个优化都是我培育的花朵&#xff0c;每一个特性都是我放飞的蝴蝶…

字节跳动GR-3:可泛化、支持长序列复杂操作任务的机器人操作大模型(技术报告解读)

1.总结 GR-3 是一个大规模的视觉 - 语言 - 动作&#xff08;VLA&#xff09;模型。它对新物体、新环境以及含抽象概念的新指令展现出较好的泛化能力。此外&#xff0c;GR-3 支持少量人类轨迹数据的高效微调&#xff0c;可快速且经济地适应新任务。GR-3 在处理长周期和灵巧性任…

713. 乘积小于 K 的子数组

中等 给你一个整数数组 nums 和一个整数 k &#xff0c;请你返回子数组内所有元素的乘积严格小于 k 的连续子数组的数目。 示例 1&#xff1a; 输入&#xff1a;nums [10,5,2,6], k 100 输出&#xff1a;8 解释&#xff1a;8 个乘积小于 100 的子数组分别为&#xff1a;[10…

【算法】 SM2、FSRS、SuperMemo算法实现艾宾浩斯记忆曲线,通过以上算法你也可以开发出单词记忆软件

有那些算法可以实现艾宾浩斯单词记忆 用户: 有那些算法可以实现艾宾浩斯单词记忆 元宝: 以下是基于 艾宾浩斯遗忘曲线 的智能记忆算法实现方案&#xff0c;结合 间隔重复算法 与 现代机器学习技术&#xff0c;提供从理论到实践的完整解决方案&#xff1a; 一、核心算法原理 1. …

SQL167 连续签到领金币

SQL167 连续签到领金币 题目描述 用户行为日志表 tb_user_log iduidartical_idin_timeout_timesign_in110102021-07-07 10:00:002021-07-07 10:00:091210102021-07-08 10:00:002021-07-08 10:00:091310102021-07-09 10:00:002021-07-09 10:00:42141010 2021-07-10 10:00:00 …

PHP性能优化与高并发处理:从基础到高级实践

引言 在当今高流量的互联网环境中,PHP应用的性能优化变得至关重要。本文将全面探讨PHP性能优化的各个层面,从基础优化技巧到高级并发处理方案,帮助开发者构建高性能的PHP应用。 基础性能优化 OPcache配置优化 ; php.ini 推荐OPcache配置 [opcache] opcache.enable=1 opc…

C++ std::map erase() 和迭代器详解:常见面试陷阱与深入理解

在使用 C 的 std::map 时&#xff0c;配合 erase() 和迭代器的使用是一个经典面试点&#xff0c;也是实际开发中经常出错的地方。本文将深入讲解 erase() 的行为、end() 的本质以及迭代器失效规则&#xff0c;帮助你写出更健壮的代码。1. erase(it) 的行为当你使用 erase(it) 删…