Qt新手入门指南 - 如何创建模型/视图(三)
每个UI开发人员都应该了解ModelView编程本教程的目标是为大家提供一个简单易懂的介绍。Qt是目前最先进、最完整的跨平台C开发工具。它不仅完全实现了一次编写所有平台无差别运行更提供了几乎所有开发过程中需要用到的工具。如今Qt已被运用于超过70个行业、数千家企业支持数百万设备及应用。在上文中我们主要为大家介绍了Model/View模型/视图的一些基本概念本文将继续为大家介绍如何创建一个简单的模型/视图应用。2. 一个简单的模型/视图应用如果想开发一个模型/视图应用程序应该从哪里开始呢我们建议从一个简单的示例开始逐步扩展它这使得理解体系结构更加容易。对于许多开发人员来说在调用IDE之前试图详细理解模型/视图体系结构是不太方便的从具有演示数据的简单模型/视图应用程序开始实际上更容易。下面是7个非常简单且独立的应用程序它们展示了模型/视图编程的不同方面源代码可以在examples/widgets/tutorials/modelview目录中找到。2.3 表单元格内的时钟我们仍然有一个只读表但这一次内容每秒都在变化因为正在显示当前时间。(文件来源examples/widgets/tutorials/modelview/3_changingmodel/mymodel.cpp)QVariant MyModel::data(const QModelIndex index, int role) const { int row index.row(); int col index.column(); if (role Qt::DisplayRole row 0 col 0) return QTime::currentTime().toString(); return QVariant(); }时钟的滴答声缺少了一些东西需要每一秒都告诉视图时间已经改变、需要再次读取。我们用定时器来做这个在构造函数中我们将其间隔设置为1秒并连接其超时信号。(文件来源examples/widgets/tutorials/modelview/3_changingmodel/mymodel.cpp)MyModel::MyModel(QObject *parent) : QAbstractTableModel(parent) , timer(new QTimer(this)) { timer-setInterval(1000); connect(timer, QTimer::timeout , this, MyModel::timerHit); timer-start(); }这里是对应的槽位(文件来源examples/widgets/tutorials/modelview/3_changingmodel/mymodel.cpp)void MyModel::timerHit() { // we identify the top left cell QModelIndex topLeft createIndex(0,0); // emit a signal to make the view reread identified data emit dataChanged(topLeft, topLeft, {Qt::DisplayRole}); }通过发出dataChanged() 信号我们要求视图再次读取左上角单元格中的数据。注意没有显式地将dataChanged()信号连接到视图这在调用setModel()时自动发生。2.4 设置列和行标题标题可以通过一个视图方法隐藏ableView-verticalHeader()-hide()然而头部内容是通过模型设置的所以我们重新实现headerData()方法(文件来源examples/widgets/tutorials/modelview/4_headers/mymodel.cpp)QVariant MyModel::headerData(int section, Qt::Orientation orientation, int role) const { if (role Qt::DisplayRole orientation Qt::Horizontal) { switch (section) { case 0: return QString(first); case 1: return QString(second); case 2: return QString(third); } } return QVariant(); }注意方法headerData()也有一个参数role其含义与MyModel::data()中的相同。2.5 最小编辑示例在本例中我们将构建一个应用程序通过重复输入到表格单元格中的值自动用内容填充窗口标题。为了能够方便地访问窗口标题我们将QTableView放在QMainWindow中。模型决定编辑功能是否可用为了启用可用的编辑功能我们只需要修改模型这是通过重新实现以下虚拟方法来实现的:setData() 和flags()。(文件来源examples/widgets/tutorials/modelview/5_edit/mymodel.h)// mymodel.h #include QAbstractTableModel #include QString const int COLS 3; const int ROWS 2; class MyModel : public QAbstractTableModel { Q_OBJECT public: MyModel(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; bool setData(const QModelIndex index, const QVariant value, int role Qt::EditRole) override; Qt::ItemFlags flags(const QModelIndex index) const override; private: QString m_gridData[ROWS][COLS]; //holds text entered into QTableView signals: void editCompleted(const QString ); };我们使用二维数组QString m_gridData来存储数据这使得m_gridData成为MyModel的核心。MyModel的其余部分就像一个包装器并将m_gridData适配到QAbstractItemModel接口同时我们引入了editCompleted()信号这使得将修改后的文本传输到窗口标题成为可能。(文件来源examples/widgets/tutorials/modelview/5_edit/mymodel.cpp)bool MyModel::setData(const QModelIndex index, const QVariant value, int role) { if (role Qt::EditRole) { if (!checkIndex(index)) return false; //save value from editor to member m_gridData m_gridData[index.row()][index.column()] value.toString(); //for presentation purposes only: build and emit a joined string QString result; for (int row 0; row ROWS; row) { for (int col 0; col COLS; col) result m_gridData[row][col] ; } emit editCompleted(result); return true; } return false; }每次用户编辑单元格时都会调用setData()index参数告诉我们编辑了哪个字段value提供了编辑过程的结果。角色总是被设置为Qt::EditRole 因为我们的单元格只包含文本如果存在一个复选框并且用户权限设置为允许选择该复选框则调用也会将角色设置为Qt::CheckStateRole。(文件来源examples/widgets/tutorials/modelview/5_edit/mymodel.cpp)Qt::ItemFlags MyModel::flags(const QModelIndex index) const { return Qt::ItemIsEditable | QAbstractTableModel::flags(index); }可以使用flags()调整单元格的各种属性。返回Qt::ItemIsSelectable | Qt::ItemIsEditable | Qt::ItemIsEnabled足以向编辑器显示一个单元格可以被选择。如果编辑一个单元格修改的数据多于该特定单元格中的数据则模型必须发出dataChanged()信号以便读取已更改的数据。

相关新闻

DDrawCompat 实战速成:三步让 DirectX 1-7 老游戏在新系统上满血复活

DDrawCompat 实战速成:三步让 DirectX 1-7 老游戏在新系统上满血复活

DDrawCompat 实战速成:三步让 DirectX 1-7 老游戏在新系统上满血复活 【免费下载链接】DDrawCompat DirectDraw and Direct3D 1-7 compatibility, performance and visual enhancements for Windows Vista, 7, 8, 10 and 11 项目地址: https://gitcode.com/gh_mir…

2026/8/18 13:17:12 阅读更多 →
如何免费解锁加密音乐文件?浏览器里的Unlock Music实战指南

如何免费解锁加密音乐文件?浏览器里的Unlock Music实战指南

如何免费解锁加密音乐文件?浏览器里的Unlock Music实战指南 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库: 1. https://github.com/unlock-music/unlock-music ;2. https://git.unlock-music.dev/um/web 项目地址: …

2026/8/18 13:17:12 阅读更多 →
告别格式锁:ncmdump 免费把网易云 NCM 无损转成 MP3,拖一下就行

告别格式锁:ncmdump 免费把网易云 NCM 无损转成 MP3,拖一下就行

告别格式锁:ncmdump 免费把网易云 NCM 无损转成 MP3,拖一下就行 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump ncmdump 是一个几百 KB 的免费开源小工具,作用就一句话:把网易云音乐缓…

2026/8/18 13:17:12 阅读更多 →

最新新闻

BilibiliDown 免费跨平台指南:3分钟跑通B站视频批量下载的完整上手方案

BilibiliDown 免费跨平台指南:3分钟跑通B站视频批量下载的完整上手方案

BilibiliDown 免费跨平台指南:3分钟跑通B站视频批量下载的完整上手方案 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.…

2026/8/18 13:57:39 阅读更多 →
tiny11builder 使用教程:两个 PowerShell 脚本给 Windows 11 减重,老旧电脑也能流畅跑

tiny11builder 使用教程:两个 PowerShell 脚本给 Windows 11 减重,老旧电脑也能流畅跑

tiny11builder 使用教程:两个 PowerShell 脚本给 Windows 11 减重,老旧电脑也能流畅跑 【免费下载链接】tiny11builder Scripts to build a trimmed-down Windows 11 image. 项目地址: https://gitcode.com/GitHub_Trending/ti/tiny11builder 先坦…

2026/8/18 13:57:39 阅读更多 →
ComfyUI-WanVideoWrapper 保姆级教程:3步上手 AI 视频生成全家桶

ComfyUI-WanVideoWrapper 保姆级教程:3步上手 AI 视频生成全家桶

ComfyUI-WanVideoWrapper 保姆级教程:3步上手 AI 视频生成全家桶 【免费下载链接】ComfyUI-WanVideoWrapper 项目地址: https://gitcode.com/GitHub_Trending/co/ComfyUI-WanVideoWrapper 如果你是一名 ComfyUI 玩家,最近一定被各种新发布的视频…

2026/8/18 13:57:39 阅读更多 →
免费开源的离线电路仿真软件 CircuitJS1 Desktop Mod:15 分钟装好,断网也能跑电路

免费开源的离线电路仿真软件 CircuitJS1 Desktop Mod:15 分钟装好,断网也能跑电路

免费开源的离线电路仿真软件 CircuitJS1 Desktop Mod:15 分钟装好,断网也能跑电路 【免费下载链接】circuitjs1 Standalone (offline) version of the Circuit Simulator with small modifications based on modified NW.js. 项目地址: https://gitcod…

2026/8/18 13:57:39 阅读更多 →
iPhone照片导入Windows全是空白图标?免费让HEIC缩略图清晰显示

iPhone照片导入Windows全是空白图标?免费让HEIC缩略图清晰显示

iPhone照片导入Windows全是空白图标?免费让HEIC缩略图清晰显示 【免费下载链接】windows-heic-thumbnails Enable Windows Explorer to display thumbnails for HEIC/HEIF files 项目地址: https://gitcode.com/gh_mirrors/wi/windows-heic-thumbnails 把 iP…

2026/8/18 13:57:39 阅读更多 →
Appwrite自动打包全流程:GitHub Actions一键生成专属部署包的完整指南

Appwrite自动打包全流程:GitHub Actions一键生成专属部署包的完整指南

Appwrite自动打包全流程:GitHub Actions一键生成专属部署包的完整指南 【免费下载链接】Appwrite 项目地址: https://gitcode.com/gh_mirrors/appw/Appwrite Appwrite是一个适配Appwrite Functions的隧道代理服务,它的自动打包能力让部署变得异常…

2026/8/18 13:56:39 阅读更多 →

日新闻

告别逐帧截图:用 extract-video-ppt 快速提取视频中的 PPT 并一键导出 PDF

告别逐帧截图:用 extract-video-ppt 快速提取视频中的 PPT 并一键导出 PDF

告别逐帧截图:用 extract-video-ppt 快速提取视频中的 PPT 并一键导出 PDF 【免费下载链接】extract-video-ppt extract the ppt in the video 项目地址: https://gitcode.com/gh_mirrors/ex/extract-video-ppt 如果你还停留在"看网课 不停暂停 截图 …

2026/8/18 0:00:57 阅读更多 →
思源宋体TTF一站式上手:7个字重免费商用,从下载到上线的完整走查

思源宋体TTF一站式上手:7个字重免费商用,从下载到上线的完整走查

思源宋体TTF一站式上手:7个字重免费商用,从下载到上线的完整走查 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 你是不是也经历过这种时刻:设计稿里…

2026/8/18 0:00:58 阅读更多 →
华硕笔记本控制权回收指南:GHelper 如何用一个 10MB 文件替代 Armoury Crate

华硕笔记本控制权回收指南:GHelper 如何用一个 10MB 文件替代 Armoury Crate

华硕笔记本控制权回收指南:GHelper 如何用一个 10MB 文件替代 Armoury Crate 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, …

2026/8/18 0:00:59 阅读更多 →

周新闻

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

如果你是一名开发者,最近可能已经感受到了AI大模型正在从“玩具”变成“生产力工具”的强烈信号。从代码补全到智能Agent,从本地部署到云端API,我们正处在一个技术栈快速重构的节点。然而,面对层出不穷的模型、框架和工具&#xf…

2026/8/18 9:15:35 阅读更多 →
工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/18 9:06:28 阅读更多 →
【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

2026/8/18 9:04:56 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/17 18:54:37 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/17 18:55:16 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/17 18:55:55 阅读更多 →