Pyqt中View类别容器和Widget类别容器的区别

简介

在beta迭代中,我们选择用pyqt5来重写alpha迭代中使用tkinter库编写的界面。

​ 按钮之类的与tkiner使用无异,在显示“测试报告”和“测试队列”这方面,我打算使用列表类控件,但是在qt designer中发现了两个看起来类似的控件:QListViewQListWidget。这两个控件有什么区别呢? 从文档中我得知,QListWidget是继承自QListView的,其他Widget容器也是继承自对应View容器,而QListView是继承自一个抽象基类QAbastractItemView(python中采用@abstractmethod实现),三者之间有着以下关系:

​ 但是知道QListViewQListWidget的一个子类,只是知道了他们的联系,似乎还是不能直观反映他们的区别。

​ 我们能从网上找到一个不错的解释:

​ QListView 里没有自己的"模型"要自己建模来保存数据,这可以很大程度上降低数据冗余,提高程序的效率.但是要求我们对view/model框架比较了解,不适合新手使用.
​ QListWidget是QListView的子类,在QListWidget中已经帮我们定义好了一个模型.这个模型非常方便,十分全面.这样就可以直接在QListWidget里面添加数据,而不用在从新制定一个模型了.十分方便.

其实QListView和QListWidget的主要区别就是有木有自己的模型而已.

​ View类别容器和Widget类别容易主要区别就在于“模型”。那么什么是模型呢?模型是将数据从视图中分离出来的产物,提供和数据交互的接口。Widget类型容器内置了一个简单的模型,我们可以直接调用实例的addItem()addItems()方法来给Widget添加元素,相应变化会直接反映到界面上。而View类别采用了所谓的view/model框架,对视图和数据进行了分离、解耦。Widget部件并没有被设计为可以从视图中分离数据。View类型和Widgt类型看起来相同,但它们与数据的交互方式不同。

view/model框架

​ view/model框架是qt在qt4以后的版本中用来处理数据和面向用户的最终显示的之间的关系,这种架构也允许使用不同界面显示同一数据,也能够在不改变数据的情况下添加新的显示界面,而这是普通的widget类控件做不到的。除了view和model以外,qt还引入了委托(delegate),用来自定义数据项的渲染和编辑。三者的关系如下:

​ 由于我们组项目目前阶段数据的展示较为简单,选择了相对易用的QListWidget作为显示数据的方式,因此还未对view/model框架和委托有较为深入的研究。

模型

​ 所有的模型都是QAbstractItemModel的子类。这个类定义了供视图和委托访问数据的接口。模型并不存储数据本身。这意味着可以将数据存储在一个数据结构中、另外的类中、文件中、数据库中,或者其他所能想到的东西中。

QAbstractItemModel提供的接口足够灵活,足以应付以表格、列表和树的形式显示的数据。但是,如果需要为列表或者表格设计另外的模型,直接继承QAbstractListModelQAbstractTableModel类可能更好一些,因为这两个类已经实现了很多通用函数。

​ Qt 内置了许多标准模型:

  • QStringListModel:存储简单的字符串列表。
  • QStandardItemModel:可以用于树结构的存储,提供了层次数据。
  • QFileSystemModel:本地系统的文件和目录信息。
  • QSqlQueryModelQSqlTableModelQSqlRelationalTableModel:存取数据库数据。

如果这些标准模型不能满足需要,就必须继承QAbstractItemModelQAbstractListModel或者QAbstractTableModel,创建自己的模型类。

最新文章

  1. CentOS系统 yum 安装 iftop实时流量监控工具
  2. Ubuntu开发笔记
  3. Shopping(山东省第一届ACM省赛)
  4. jquery easyui校验select下拉列表值是否为空的问题
  5. C# 通过自定义特性 实现根据实体类自动创建数据库表
  6. js兼容性问题
  7. 用php理解指针--写给刚刚学习编程的人
  8. Jquery_Ajax文件上传
  9. 程序中非action获得spring容器
  10. 京东商城招聘匹配系统资深工程师 T4级别
  11. Java--回调接口
  12. js 向form表单中插入数据
  13. 计算机基础理论知识梳理篇(三):VLAN与VLAN网卡相关概念
  14. [DeeplearningAI笔记]ML strategy_1_2开发测试集评价指标
  15. c/c++ 栈与队列实现车库的出入与收费
  16. Linux3.10.0块IO子系统流程(0)-- 块IO子系统概述
  17. 【LINUX】——FreeBSD中的一些常规配置
  18. Laravel 开启跨域请求
  19. TCP的三次握手与四次挥手(详解+动图)
  20. 超全面的JavaWeb笔记day22<文件上传>

热门文章

  1. HTML中marquee标签的使用
  2. BUAA-OO-2019 第一单元总结
  3. C# 静态方法中获取类的名称
  4. Cat搭建遇坑记
  5. PB调用C#编写的Dll类库
  6. UML类图 入门 (转载)
  7. MySQL 5.7数据库参数优化
  8. 解决使用Microsoft Graph OAuth获取令牌时,没有refresh_token的问题
  9. spring Cloud Feign作为HTTP客户端调用远程HTTP服务
  10. 图论 - PAT甲级 1013 Battle Over Cities C++