[技术博客]Pyqt中View类别容器和Widget类别容器的区别

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

简介

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

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

wKioL1hCXUrRjKZmAABhDhXTNOI908.png

​ 可是知道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),用来自定义数据项的渲染和编辑。三者的关系以下:设计

Model View 概览

​ 因为咱们组项目目前阶段数据的展现较为简单,选择了相对易用的QListWidget做为显示数据的方式,所以还未对view/model框架和委托有较为深刻的研究。code

模型

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

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

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

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

若是这些标准模型不能知足须要,就必须继承QAbstractItemModelQAbstractListModel或者QAbstractTableModel,建立本身的模型类。