Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >PySide——Python图形化界面入门教程(六)

PySide——Python图形化界面入门教程(六)

作者头像
ascii0x03
发布于 2018-04-12 04:56:32
发布于 2018-04-12 04:56:32
2.2K00
代码可运行
举报
运行总次数:0
代码可运行

PySide——Python图形化界面入门教程(六)

            ——QListView和QStandardItemModel

翻译自:http://pythoncentral.io/pyside-pyqt-tutorial-qlistview-and-qstandarditemmodel/

上一个教程中,我们讨论了Qt的QListWidget类,它用来实现简单的单列列表框(list boxes)。然而,我们还需要更加灵活的widget来实现列表,Qt为此提供了QListView 来实现多种多样的项。它是一个纯粹的显示部件,用来显示数据模型提供的信息。这样做将将显示功能和数据逻辑分离开来;这同时还有一些其他widget可以显示来自同一模型结构的数据。

这里已经有一些创建好的几种类型的模型。比如,QStandardItemModel提供了比上一节QListWidget更棒的能力;拿文本和图标来说,它提供了拖拽的能力、checkable items和其他一些特性。自定义行为可以通过QAbstractlistModel继承实现——列表数据的通用模型。

PySide的QStandardItemModel

 我们首先从讨论QListView来开始。QListView可以像其他的QWidget一样进行实例化——你是不是对每次讲一个widget都说这句话感到厌烦了?虽然有些啰嗦,但是让我们清晰的记得对象模型;PyQt/Pyside最优秀的地方就是它的简单、好记和继承性。这就是说,QListView构造器接收一个可选的参数parent:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
list = QListView(parent)

现在我们的列表需要一个模型来管理它的数据。以我们的列表作为parent参数创建一个QStandardItemModel:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
model = QStandardItemModel(list)

QStandardItemModel还有其他一些构造器,但是和我们的单列列表无关,我们有时间再来讨论。

PySide的QStandardItem

创建列表和模型是最简单的部分;列表的主要任务创建并嵌入模型。例如,我们先创建一个项:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
item = QStandardItem()

方便地设置它的文本和图标:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
item.setText('Item text')
item.setIcon(some_QIcon)

我们也可以让项目变成多选的,这将在项目的最左边添加一个复选框(checkbox)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
item.setCheckable(True)

你还可以让复选框有三种状态——checked,unchecked,和null,使用

item.setCheckable(True)。

一个简单的QStandardItem例子

我们现在已经了解了QListView足够的背景,尽管它还什么都不能做。我们让QListView成为主窗口来尽可能的简化,就像其它任何QWidget作为主窗口的例子一样进行最基本的设置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1 list = QListView()
2 list.setWindowTitle('Example List')
3 list.setMinimumSize(600, 400)

接下来创建我们的模型:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
model = QStandardItemModel(list)

然后我们创建一些QStandardItem来填充我们的模型。就列出我们想要的吃的事物吧,每一个都有一个文本标题和复选框。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1 foods = [
 2     'Cookie dough', # Must be store-bought
 3     'Hummus', # Must be homemade
 4     'Spaghetti', # Must be saucy
 5     'Dal makhani', # Must be spicy
 6     'Chocolate whipped cream' # Must be plentiful
 7 ]
 8  
 9 for food in foods:
10     # Create an item with a caption
11     item = QStandardItem(food)
12  
13     # Add a checkbox to it
14     item.setCheckable(True)
15  
16     # Add the item to the model
17     model.appendRow(item)

最后,将模型应用至QListView,显示窗口运行app。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1 list.setModel(model)
2 list.show()
3 app.exec_()

完整的例子代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1 # Create a Qt application
 2 app = QApplication(sys.argv)
 3  
 4 # Our main window will be a QListView
 5 list = QListView()
 6 list.setWindowTitle('Example List')
 7 list.setMinimumSize(600, 400)
 8  
 9 # Create an empty model for the list's data
10 model = QStandardItemModel(list)
11  
12 # Add some textual items
13 foods = [
14     'Cookie dough', # Must be store-bought
15     'Hummus', # Must be homemade
16     'Spaghetti', # Must be saucy
17     'Dal makhani', # Must be spicy
18     'Chocolate whipped cream' # Must be plentiful
19 ]
20  
21 for food in foods:
22     # create an item with a caption
23     item = QStandardItem(food)
24  
25     # add a checkbox to it
26     item.setCheckable(True)
27  
28     # Add the item to the model
29     model.appendRow(item)
30  
31 # Apply the model to the list view
32 list.setModel(model)
33  
34 # Show the window and run the app
35 list.show()
36 app.exec_()

运行的时候看上去像是这样:

添加简单的功能

让我们看看如何让带有QStandardItemModel的QListView来与用户交互。你或许想象每个QStandardItem都像一个QPushButton,当被选择、编辑、等等的时候都会发出信号。如果你这样想,就像我一样,那就错了!在QStandardItemModel中,有一个更加强大的信号——itemChanged(item)来说明发生了什么。就像你看到的那样,它把发生变化的项发送给槽,你需要检查项来知道发生了什么。虽然不完美,但它确是这样的。

你还可以使用模型的item方法来检查没有改变过的项,它返回指定行(从0开始)的项。(同样可接受单列、多列模型)

这还有许多信号来表现模型结构的改变;它们都是从QAbstractItemModel继承而来,我们会在讨论QAbstractItemModel主题时再来学习它们。现在的例子我们还不需要。

现在我们来让清单更甜蜜(honey-do,作者还是很幽默的,但是我翻译不出来^_^)一些。你使用列表登记已经购买了的项,当你完成时,窗口会关闭。首先,改变标题:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
list.setWindowTitle('Honey-Do List')

然后,我们需要一个槽来连接模型的itemChanged信号。当然, 我们首先需要使用checkState方法检查发生变化的项是否被选中,来避免每次遍历项。如果已经选中了,我们再检查是否其他的都被选中;如果都被选中了(即你已经都购买了),则退出QApplication。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1 def on_item_changed(item):
 2     # If the changed item is not checked, don't bother checking others
 3     if not item.checkState():
 4         return
 5  
 6     i = 0
 7  
 8     # loop through the items until you get None, which
 9     # means you've passed the end of the list
10     while model.item(i):
11         if not model.item(i).checkState():
12             return
13         i += 1
14  
15     app.quit()

然后,我们将信号和槽连接起来:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
model.itemChanged.connect(on_item_changed)

完整的代码如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1 # Create a Qt application
 2 app = QApplication(sys.argv)
 3  
 4 # Our main window will be a QListView
 5 list = QListView()
 6 list.setWindowTitle('Honey-Do List')
 7 list.setMinimumSize(600, 400)
 8  
 9 # Create an empty model for the list's data
10 model = QStandardItemModel(list)
11  
12 # Add some textual items
13 foods = [
14     'Cookie dough', # Must be store-bought
15     'Hummus', # Must be homemade
16     'Spaghetti', # Must be saucy
17     'Dal makhani', # Must be spicy
18     'Chocolate whipped cream' # Must be plentiful
19 ]
20  
21 for food in foods:
22     # Create an item with a caption
23     item = QStandardItem(food)
24  
25     # Add a checkbox to it
26     item.setCheckable(True)
27  
28     # Add the item to the model
29     model.appendRow(item)
30  
31 def on_item_changed(item):
32     # If the changed item is not checked, don't bother checking others
33     if not item.checkState():
34         return
35  
36     # Loop through the items until you get None, which
37     # means you've passed the end of the list
38     i = 0
39     while model.item(i):
40         if not model.item(i).checkState():
41             return
42         i += 1
43  
44     app.quit()
45  
46 model.itemChanged.connect(on_item_changed)
47  
48 # Apply the model to the list view
49 list.setModel(model)
50  
51 # Show the window and run the app
52 list.show()
53 app.exec_()

这是一个QListView的简单例子。它还可以做更多的事情,但是相同的模型同样也可以用于其他的widget。下一次,我们将看一些完全不同的东西,一个最让原作者兴奋的部件,QWebView,一个基于WebKit的可以解析HTML/CSS/XML/XSLT页面的控件。(话虽如此,但是下个教程不在Qt wiki的入门教程之列,所以我就先不进行翻译了,需要的读者可以查看原作者的原文http://pythoncentral.io/pyside-pyqt-tutorial-qwebview/)

一些感想:

对于初学者,更多的资料应该还是要参考https://wiki.qt.io/PySide_Tutorials,这一至六的教程就是翻译的PythonCentral的3至8部分,仅仅起到抛砖引玉的作用。在学习之前,我首先还是喜欢搜索中文的资料,因为毕竟母语接受的快一些。可是搜索中却发现优秀的中文教程太少了,而英文教程我感觉要清晰的多,能让我从0基础开始更好的理解PySide,而不是不知其所以然的简单操作步骤。正是这个原因,我边看边进行了翻译,希望能帮到更多新手入门。同时也希望出现更多优秀的中文教程,并有更多的人来翻译优秀的英文官方教程。最后,由于译者水平十分有限,不周之处还请谅解。

补充:

发现一个优秀的详细中文系列教程(不过好些是C++),敬佩豆子作者的精神:http://www.devbean.net/2012/08/qt-study-road-2-catelog/

Pyside的官方手册:http://pyside.github.io/docs/pyside/

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016-05-19 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
PySide——Python图形化界面入门教程(五)
PySide——Python图形化界面入门教程(五)               ——QListWidget 翻译自:http://pythoncentral.io/pyside-pyqt-tutorial-the-qlistwidget/ Qt具有简洁和方便的几个部件,用来作单列表选择,我们称之为列表框。最灵活的方法是使用一个是Qlistview,它提供了一个必须由程序员定义UI视图、高度灵活的列表模式;一个简单的方法是使用QListWidget,它具有一个预先定义的基于项目的模型,用来处理常见的列表框。
ascii0x03
2018/04/12
1.9K0
PySide——Python图形化界面入门教程(五)
PySide6 GUI 编程(40):MVC 设计原则下QListView的使用
代码应该遵循MVC(模型-视图-控制器)设计原则,将数据模型、视图和控制器分离,以便于维护和扩展。
bowenerchen
2024/09/01
4061
PySide6 GUI 编程(40):MVC 设计原则下QListView的使用
PySide——Python图形化界面入门教程(四)
PySide——Python图形化界面入门教程(四)               ——创建自己的信号槽               ——Creating Your Own Signals and Slots 翻译自:http://pythoncentral.io/pysidepyqt-tutorial-creating-your-own-signals-and-slots/ 你不必局限于Qt widget提供的信号,你可以使用Signal类来创建自己的信号。下面是一个定义的简单例子: 1 from PyS
ascii0x03
2018/04/12
1.2K0
PySide——Python图形化界面入门教程(二)
PySide——Python图形化界面入门教程(二)   ——交互Widget和布局容器                ——Interactive Widgets and Layout Containers 翻译自:http://pythoncentral.io/pyside-pyqt-tutorial-interactive-widgets-and-layout-containers/ 上一个教程中,我们了解了一些QWidget提供的功能,还有一个特殊的子类QLabel。更进一步的,我们完成了一个用来说
ascii0x03
2018/04/12
2.7K0
PySide——Python图形化界面入门教程(二)
PySide6 GUI 编程(41):QTableView 与 QTreeView
bowenerchen
2024/09/01
5352
PySide6 GUI 编程(41):QTableView 与 QTreeView
PySide——Python图形化界面入门教程(一)
PySide——Python图形化界面入门教程(一) ——基本部件和HelloWorld 翻译自:http://pythoncentral.io/intro-to-pysidepyqt-basic-widgets-and-hello-world/ 本教程第一部分将给出PySide的最基本知识点,包含使用的对象,和一些能帮助你了解Python/Qt应用是如何构建的小例子。 首先来看一下基本的Qt对象。Qt包含了许多类去处理XML、多媒体、数据库和网络等等事物,但我们现在重点关注可视化的元素——窗口、对话框和
ascii0x03
2018/04/12
2.5K0
PySide——Python图形化界面入门教程(三)
PySide——Python图形化界面入门教程(三)          ——使用内建新号和槽               ——Using Built-In Signals and Slots 上一个教程中,我们学习了如何创建和建立交互widgets,以及将他们布局的两种不同的方法。今天我们继续讨论Python/Qt应用响应用户触发的事件:信号和槽。 当用户执行一个动作——点击按钮,选择组合框的值,在文本框中打字——这个widget就会发出一个信号。这个信号自己什么都不做,它必须和槽连接起来才行。槽是一个接
ascii0x03
2018/04/12
2K0
C/C++ Qt StandardItemModel 数据模型应用
QStandardItemModel 是标准的以项数据为单位的基于M/V模型的一种标准数据管理方式,Model/View 是Qt中的一种数据编排结构,其中Model代表模型,View代表视图,视图是显示和编辑数据的界面组件,而模型则是视图与原始数据之间的接口,通常该类结构都是用在数据库中较多,例如模型结构负责读取或写入数据库,视图结构则负责展示数据,其条理清晰,编写代码便于维护。
王瑞MVP
2022/12/22
1.7K0
C/C++ Qt StandardItemModel 数据模型应用
C++ Qt开发:StandardItemModel数据模型组件
Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍StandardItemModel数据模型组件的常用方法及灵活运用。
王瑞MVP
2023/12/23
7250
C++ Qt开发:StandardItemModel数据模型组件
【QT】QT模型/视图
MVC(Model-View-Controller)包括了3个组件:模型(model)是应用对象,用来表示数据;视图(View)是模型的用户界面,用来显示数据;控制(Controller)定义了用户界面对用户输入的反应方式。
半生瓜的blog
2023/05/13
3.2K0
【QT】QT模型/视图
《QTreeView+QAbstractItemModel自定义模型》:系列教程之三[通俗易懂]
Qt中模型类的层次结构
全栈程序员站长
2022/07/01
6.6K0
《QTreeView+QAbstractItemModel自定义模型》:系列教程之三[通俗易懂]
C/C++ Qt ListWidget 列表框组件应用
ListWidget列表框组件,该组件与TreeWidget有些相似,区别在于TreeWidget可以实现嵌套以及多字段结构,而ListWidget组件则只能实现单字段结构,ListWidget组件常用于显示单条记录,例如只显示IP地址,用户名等数据,如下笔记是本人在开发中经常用到的一些基本操作技巧,包括列表框组件的基本操作方法。
王瑞MVP
2022/12/23
1.2K0
C/C++ Qt ListWidget 列表框组件应用
C/C++ Qt ListWidget 列表框组件应用
ListWidget列表框组件,该组件与TreeWidget有些相似,区别在于TreeWidget可以实现嵌套以及多字段结构,而ListWidget组件则只能实现单字段结构,ListWidget组件常用于显示单条记录,例如只显示IP地址,用户名等数据,如下笔记是本人在开发中经常用到的一些基本操作技巧,包括列表框组件的基本操作方法。
王瑞MVP
2022/12/28
1.2K0
C/C++ Qt ListWidget 列表框组件应用
PyQt5 高级界面控制(表格、树、tab、dock、scrollbar、多文档界面)
learn from 《PyQt5 快速开发与实战》 https://doc.qt.io/qtforpython/index.html https://www.riverbankcomputing.com/static/Docs/PyQt5
Michael阿明
2022/05/30
7.2K0
PyQt5 高级界面控制(表格、树、tab、dock、scrollbar、多文档界面)
QTableView + QStandardItemModel模式显示表格冻结列(模板)
QTableView 是 Qt 框架中一个用于显示和编辑表格数据的控件。它提供了一个灵活的界面,允许用户通过行和列来浏览和修改数据。QTableView 支持多种数据模型,如 QAbstractItemModel,并且可以与模型一起使用,以提供数据视图。此外,QTableView 还提供了排序、筛选和分组等功能,以满足不同的需求。
Qt历险记
2024/07/29
6570
QTableView + QStandardItemModel模式显示表格冻结列(模板)
Python Qt GUI设计:QTableView、QListView、QListWidet、QTableWidget、QTreeWidget和QTreeWidgetltem表格和树类(提升篇—1)
表格与树解决的问题是如何在一个控件中有规律地呈现更多的数据。PyQt提供了两种控件类用于解决该问题,其中一种是表格结构的控件类,另一种是树形结构的控件类。
不脱发的程序猿
2021/11/02
4.1K0
python pyqt5 QTableView
import sys from PyQt5.QtCore import * from PyQt5.QtWidgets import * from PyQt5.QtGui import *
用户5760343
2022/01/10
9840
python pyqt5 QTableView
Python写的嗅探器——Pyside,Scapy
使用Python的Pyside和Scapy写的嗅探器原型,拥有基本框架,但是功能并不十分完善,供参考。 1 import sys 2 import time 3 import binasc
ascii0x03
2018/04/12
2K0
Python写的嗅探器——Pyside,Scapy
原创 | 整理了32个Python图形化界面库
今天给大家分享了一个我觉得很有趣的东西:图形用户界面(Graphical User Interface,简称 GUI)。
程序员晚枫
2022/05/14
7.6K0
原创 | 整理了32个Python图形化界面库
QListWidget用法
https://blog.csdn.net/qq_37233607/article/details/78145118
全栈程序员站长
2022/09/06
1.4K0
推荐阅读
相关推荐
PySide——Python图形化界面入门教程(五)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验