引言Python是一种面向对象的高级动态编程语言,相比于其它如C/C++语言,具有上手快、代码少、开发效率高的特点,Qt是跨平台的C++图形用户界面应用程序开发框架,是当前主流的GUI开发工具之一,其在Python下的绑定是PyQt库 。使用“Python+PyQt”架构编写应用软件,可以做到在兼顾软件运行效率的前提下,大大节省时间成本,加快项目的开发进度 。
在Qt界面库中,Model/View即模型/视图结构可将界面组件与数据进行分离,是处理数据与界面的一种较好的方法 。其中,视图(View)是显示和编辑数据的界面组件,模型(Model)是视图与原始数据的接口 。由于数据源与显示界面通过Model/View结构分离开来,因此可将一个数据模型在不同的视图中显示,也可在不修改数据模型的前提下,设计特殊的视图组件 。
在Qt中,提供了一些常用的视图组件如QListView、QTreeView、QTableView等,也提供了多种预定义的数据模型,如QStringListModel、QFileSystemModel、QStandItemModel等 。
其中,QStringListModel是一种比较简单的用于处理字符串列表的数据模型,它可作为QListView视图组件的数据模型,在界面上显示和编辑字符串列表 。下面给出一个在Python语言下使用PyQt界面库,将QStingListModel数据模型结合QListView视图组件进行数据编辑及显示的例子 。
示例说明该例使用QStringListModel作为数据模型,QListView作为视图组件,演示这种Model/View视图结构编辑字符串列表的功能,示例运行界面如下图所示:
文章插图
在主界面上,窗口左侧包括了对QStringListModel的一些操作按钮及QListView视图组件,右侧QPlainTextEdit中可以显示当前QStringListModel中的内容,以便查看其是否与界面上ListView视图组件上显示的内容一致 。最下面一行使用Label控件显示QListView视图组件上当前选中项的行、列信息 。
界面设计界面部分使用设计师设计,关于设计师设计界面的步骤可查看以前的文章,使用设计师编写界面程序入门示例 。本例保存为“Main.ui”,完成后界面(左边)及窗口中涉及到的所有界面对象元素的布局情况(右边)如下图所示:
文章插图
主窗口实现代码主窗口类MainWnd主要实现代码如下图所示:
文章插图
其主要代码解释如下:
(1)第21-27行,初始化函数 。其中,使用QStringListModel类创建一个数据模型实例,使用setStringList函数将一个字符串列表的内容作为数据模型的初始数据内容,使用setModel函数完成数据模型与视图组件的关联,使用setEditTriggers函数设置视图组件的条目是否可以编辑以及如何进入编辑状态,本例设置为双击或选择单击列表项后就进入编辑状态 。最后进行了信号与槽函数的关联 。
(2)第40-44行,添加项槽函数,在列表的最后一行添加一行新内容“new item” 。
(3)第46-50行,插入项槽函数,在列表当前行的前面行添加一行新内容“inserted item” 。
(4)第52-54行,删除当前项槽函数,使用removeRow函数删除当前行所在的项 。
(5)第56-57行,删除列表所有项槽函数,使用removeRows函数删除整个列表项 。
(6)第59-60行,重新初始化列表内容 。
(7)第62-63行,当单击视图组件时,其clicked()信号会传递一个QModelIndex类型的参数,利用该参数,在界面下方显示当前列表项的模型索引的行和列信息 。
(8)第65-66行,清空主界面右边QPlainTextEdit的内容 。
(9)第68-72行,通过数据模型的stringList函获取字符串列表,并在QPlainTextEdit里逐行显示 。程序运行时,无论对ListView作了何种编辑和修改,当单击“显示数据模型列表”按钮时,在这儿显示的内容应该与ListView里总是完全相同的,即数据模型里面的数据与界面上显示的内容始终是同步的 。
完整测试代码程序完整测试代码如下图所示:
文章插图
运行后就会出现本文开头所示的软件界面 。
总结本文给出了在Python+PyQt架构下,关于Model/View即模型/视图结构,最简单的一个QStingListModel数据模型与QListView视图组件相结合进行数据编辑及显示的例子 。从这儿可以看出,在Model/View结构中,数据模型与视图组件完全是分离的,可以直接操作数据模型以修改数据,同时,在视图组件中作的修改也会自动保存到数据模型里 。
推荐阅读
- 数据仓库系统架构和数仓分层体系介绍
- 全新架构的 Hmily 分布式事务框架 2.1.1发布
- 缓存只会用!缓存架构没听过?分布式多级缓存大瓶装,你拎包带走
- springcloud微服务架构开发实战:分布式消息总线
- 怎么理解Laravel的核心架构
- 架构师的岗位设置、工作职责、组织定位梳理
- 知其然更要知其所以然,聊聊SQLite软件架构
- 微服务架构图
- 网易严选的网关架构演进之路
- 网络后沿:零信任网络架构