[技术博客]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 ...
随机推荐
- 【开发笔记】-CentOS配置Java环境变量
如果开发java应用,经常需要配置JAVA_HOME路径,如果是通过yum安装的jdk(一般系统会自带open-jdk),下面讲述配置过程: A 定位JDK安装路径 1. 终端输入: which ja ...
- javaScript 一些小技巧
日历 创建过去七天的数组,如果将代码中的减号换成加号,你将得到未来7天的数组集合 // 创建过去七天的数组 [...Array(7).keys()].map(days => new Date(D ...
- Workerman MySQL组件Connection用法总结
一.初始化连接 $db = new \Workerman\MySQL\Connection('host', 'port', 'user', 'password', 'db_name'); 二.获取所有 ...
- 单词demantoite翠榴石demantoite英语
一般认为翠榴石demantoite的形成条件是: (1)围岩组成应该是贫铝富铁,且附近有钙质碳酸盐出露地区,即有利于“纯度高”的钙铁榴石结晶环境.否则,若钙铝榴石端员分子比增多,2价Fe必将直接影响晶 ...
- springboot使用Fiber纤程踩过的坑
@RequestAttribute为null 在springboot中使用@FiberSpringBootApplication注解标注在SpringBootApplication上时,发现在拦截器( ...
- Python 序列、列表(List)、元组(Tuple)
序列 序列是Python中最基本的数据结构,包括字符串.列表.元组. 序列,顾名思义,是有序的,序列都有索引,都能进行索引.切片(截取).加(连接).乘(倍增).检查成员的操作. 因为序列有序,可通过 ...
- Vue 中 $nextTick() 的应用
Vue 在更新 DOM 时是异步执行的. 只要侦听到数据变化,Vue 将开启一个队列,并缓冲在同一事件循环中发生的所有数据变更.如果同一个 watcher 被多次触发,只会被推入到队列中一次.这种在缓 ...
- Impala快速入门
一.简介 Cloudera公司推出,提供对HDFS.Hbase数据的高性能.低延迟的交互式SQL查询功能.基于Hive使用内存计算,兼顾数据仓库,具有实时.批处理.多并发的优点.是CDH平台首选的PB ...
- rsync异常处理
实验环境: centos7.6 实验目的: 错误的思考,在目标端执行rsync拉取源端文件,源端也必须存在rsync命令,目的用于差异比对实现增量传输! 01.执行rsync命令不存在 02.执 ...
- rest framework 之渲染器
根据 用户请求URL 或 用户可接受的类型,筛选出合适的 渲染组件. 用户请求头: Accept:text/html,application/xhtml+xml,application/xml;q=0 ...