[技术博客]Pyqt中View类别容器和Widget类别容器的区别
Pyqt中View类别容器和Widget类别容器的区别
简介
在beta迭代中,我们选择用pyqt5来重写alpha迭代中使用tkinter库编写的界面。
按钮之类的与tkiner使用无异,在显示“测试报告”和“测试队列”这方面,我打算使用列表类控件,但是在qt designer中发现了两个看起来类似的控件:QListView和QListWidget。这两个控件有什么区别呢? 从文档中我得知,QListWidget是继承自QListView的,其他Widget容器也是继承自对应View容器,而QListView是继承自一个抽象基类QAbastractItemView(python中采用@abstractmethod实现),三者之间有着以下关系:

但是知道QListView是QListWidget的一个子类,只是知道了他们的联系,似乎还是不能直观反映他们的区别。
我们能从网上找到一个不错的解释:
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提供的接口足够灵活,足以应付以表格、列表和树的形式显示的数据。但是,如果需要为列表或者表格设计另外的模型,直接继承QAbstractListModel和QAbstractTableModel类可能更好一些,因为这两个类已经实现了很多通用函数。
Qt 内置了许多标准模型:
QStringListModel:存储简单的字符串列表。QStandardItemModel:可以用于树结构的存储,提供了层次数据。QFileSystemModel:本地系统的文件和目录信息。QSqlQueryModel、QSqlTableModel和QSqlRelationalTableModel:存取数据库数据。
如果这些标准模型不能满足需要,就必须继承QAbstractItemModel、QAbstractListModel或者QAbstractTableModel,创建自己的模型类。
[技术博客]Pyqt中View类别容器和Widget类别容器的区别的更多相关文章
- [技术博客] Django中文件的保存与访问
[技术博客] Django中文件的保存与访问 在TextMarking项目开发中,数据库需要保存用户上传的文本文档. 原型设计:用户点击上传文本->保存文本->文本发送到后端保存为文件. ...
- [技术博客]windows中使用docker技术
背景 我们的工程使用了一个叫做termux的安卓上的linux终端,这个终端在所有的软件包里硬编码了软件的运行路径(/data/data/com.termux/..),由于安卓系统的权限设计,我们名为 ...
- [技术博客]React-Native中的组件加载、卸载与setState问题
React-Native中的组件加载.卸载与setState问题. Warning: Can only update a mounted or mounting component. This usu ...
- C++中实现对map按照value值进行排序 - 菜鸟变身记 - 51CTO技术博客
C++中实现对map按照value值进行排序 - 菜鸟变身记 - 51CTO技术博客 C++中实现对map按照value值进行排序 2012-03-15 15:32:36 标签:map 职场 休闲 排 ...
- 【技术博客】Django中文件下载的实现
开发组在开发过程中,都不可避免地遇到了一些困难或问题,但都最终想出办法克服了.我们认为这样的经验是有必要记录下来的,因此就有了[技术博客]. Django中文件下载的实现 1.背景 在VisualPy ...
- 【技术博客】JWT的认证机制Django项目中应用
开发组在开发过程中,都不可避免地遇到了一些困难或问题,但都最终想出办法克服了.我们认为这样的经验是有必要记录下来的,因此就有了[技术博客]. JWT的认证机制Django项目中应用 这篇技术博客基于软 ...
- 技术博客——微信小程序的架构与原理
技术博客--微信小程序的架构与原理 在两个月的微信小程序开发过程中,我曾走了不少弯路,也曾被很多现在看来十分可笑的问题所困扰.这些弯路与困扰,基本上都是由于当时对小程序的架构理解不够充分,对小程序的原 ...
- ******IT公司面试题汇总+优秀技术博客汇总
滴滴面试题:滴滴打车数据库如何拆分 前端时间去滴滴面试,有一道题目是这样的,滴滴每天有100万的订单,如果让你去设计数据库,你会怎么去设计? 当时我的想法是根据用户id的最后一位对某个特殊的值取%操作 ...
- 【新版】Android技术博客精华汇总
[新版]Android技术博客精华汇总(原文链接内持续更新) http://www.apkbus.com/thread-313856-1-1.html Kotlin Kotlin学习资料汇总 http ...
随机推荐
- 【Mysql技术内幕InnoDB存储引擎】读书笔记
一.存储引擎 1.InnoDB引擎 设计目标是面向在线事务(OLTP)处理的应用. 支持事务.行级锁.通过多版本并发控制(MVCC)支持高并发.提供一致性非锁定读.next-key locking避免 ...
- 如何显示IntelliJ IDEA工具的Run Dashboard功能(转)
从 JetBrains released IntelliJ IDEA 2017.2.1 版本之后,新出的功能‘Run Dashboard,它能非常方便的提供开发人员查看本地springboot服务运行 ...
- 关于web浏览器的Web SQL和IndexedDB
虽然在HTML5 WebStorage介绍了html5本地存储的Local Storage和Session Storage,这两个是以键值对存储的解决方案,存储少量数据结构很有用,但是对于大量结构化数 ...
- Map去重,去重value相同的元素,保留key最小的那个值
Map<Integer,String>,Integer代表时间撮,String代表文本信息去重函数:就是删除Map中value相同的元素,只保留key最小的那个元素 public stat ...
- Android P(9.0) userdebug版本执行adb remount失败
[DESCRIPTION] 在android P版本上如果按照“FAQ18076 android 6.0 M userdebug版本执行adb remount失败”的做法在userdebug ...
- 《Spring Boot Cook Book》阅读笔记
最近一个月一直在学习Spring Boot框架,在阅读<Spring Boot Cook Book>一书的过程中,记录了一些学习笔记,在这里整理出一篇目录供大家参考. 一.Spring B ...
- java项目路径总结,java.io.File支持的路放方式
1.直接输入路径 已maven项目为例,直接输入路径的4种方式,即是File类支持的方式: /** * FileOutpurStream以字节数组方式写入文件 * @throws IOExceptio ...
- 解决网页刷新时,隐藏div元素闪现问题
最近项目遇到一个问题,需要对一个div中的元素设置根据不同的情况进行显示和隐藏. 因为默认该div是显示的,所以在刷新页面的时候,会先加载这个div进行显示,加载完成后又执行到 hide() 方法,使 ...
- C++学习(6)—— 引用
1. 引用的基本使用 作用:给变量起别名 语法:数据类型 &别名 = 原名 #include<iostream> using namespace std; int main(){ ...
- iwlist/iwconfig/iw命令
1.iwlist 命令:用于对/proc/net/wireless文件进行分析,得出无线网卡相关信息 # iwlist wlan0 scanning 搜索当前无线网络 # iwlist wlan0 f ...