Python Qt GUI设计:QTableView、QListView、QListWidet、QTableWidget、QTreeWidget和QTreeWidgetltem表格和树类(提升篇—1)

简介: Python Qt GUI设计:QTableView、QListView、QListWidet、QTableWidget、QTreeWidget和QTreeWidgetltem表格和树类(提升篇—1)

目录

1、QTableView类


2、QListView类


3、QListWidet类


4、QTableWidget类


5、QTreeWidget和QTreeWidgetltem类


表格与树解决的问题是如何在一个控件中有规律地呈现更多的数据。PyQt提供了两种控件类用于解决该问题,其中一种是表格结构的控件类,另一种是树形结构的控件类。


1、QTableView类

在通常情况下,一个应用需要和一批数据(比如数组、列表)进行交互,然后以表格的形式输出这些信息,这时就要用到QTableView类了。在QtableView中可以使用自定义的数据模型来显示内容,通过setModel来绑定数据源。


QTableWidget继承自QTableView,主要区别是QTableView可以使用自定义的数据模型来显示内容(先要通过setModel来绑定数据源),而QTableWidget只能使用标准的数据模型,并且其单元格数据是通过QTableWidgetltem对象来实现的。通常使用QTableWidget就能够满足我们的要求。


QTableView控件可以绑定一个模型数据用来更新控件上的内容,可用的模式如下表所示:


image.png


通过示例了解QTableView类的使用方法,效果如下所示:


image.png


实现代码如下所示:


from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
import sys
class Table(QWidget):
  def __init__(self, arg=None):
  super(Table, self).__init__(arg)
  self.setWindowTitle("QTableView表格视图控件的例子")    
  self.resize(500,300);
  self.model=QStandardItemModel(4,4);
  self.model.setHorizontalHeaderLabels(['标题1','标题2','标题3','标题4'])
  for row in range(4):
    for column in range(4):
    item = QStandardItem("row %s, column %s"%(row,column))
    self.model.setItem(row, column, item)
  self.tableView=QTableView()
  self.tableView.setModel(self.model)
  #下面代码让表格100填满窗口
  #self.tableView.horizontalHeader().setStretchLastSection(True)
  #self.tableView.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
  dlgLayout=QVBoxLayout();
  dlgLayout.addWidget(self.tableView)
  self.setLayout(dlgLayout)
if __name__ == '__main__':
  app = QApplication(sys.argv)  
  table = Table()
  table.show()
  sys.exit(app.exec_())

2、QListView类

QListView类用于展示数据,它的子类是QListWidget类。QListView是基于模型(Model)的,需要程序来建立模型,然后再保存数据。


QListWidget是一个升级版本的QListView,它已经建立了一个数据存储模(QListWidgetltem),直接调用addltem()函数,就可以添加条目(ltem)。


QListView类中的常用方法如下表所示:


image.png


QListView类中的常用信号如下表所示:


image.png


通过示例了解QListView类的使用方法,效果如下所示:


image.png


示例中,将QListView控件的clicked信号与自定义对象的clicked()槽函数进行绑定,当单击QListView控件里Model中的一项时会弹出消息框(提示选择的是哪─项)。


实现代码如下所示:


from PyQt5.QtWidgets import QApplication, QWidget , QVBoxLayout , QListView, QMessageBox
from PyQt5.QtCore import QStringListModel  
import sys  
class ListViewDemo(QWidget):
  def __init__(self, parent=None):
  super(ListViewDemo, self).__init__(parent)
  self.setWindowTitle("QListView 例子")
  self.resize(300, 270)    
  layout = QVBoxLayout()
  listView = QListView()      
  slm = QStringListModel();
  self.qList = ['Pyhon语言','C语言','C++语言','Java语言' ]  
  slm.setStringList(self.qList)
  listView.setModel(slm )
  listView.clicked.connect(self.clicked)  
  layout.addWidget( listView )
  self.setLayout(layout)    
  def clicked(self, qModelIndex):
  QMessageBox.information(self, "QListView", "你选择了: "+ self.qList[qModelIndex.row()])
if __name__ == "__main__":       
  app = QApplication(sys.argv)
  win = ListViewDemo()  
  win.show()  
  sys.exit(app.exec_())

3、QListWidet类

QListWidet类是一个基于条目的接口,用于从列表中添加或删除条目。列表中的每个条目都是一个QListWidgetltem对象。QListWidget可以设置为多重选择。


QListWidget类中的常用方法如下表所示:


image.png


QListWidget类中的常用信号如下表所示:


image.png


通过示例了解QListWidget类的使用方法,效果如下所示:


image.png


示例中, 将QListWidget控件的itemClicked信号与自定义对象的Clicked()槽函数进行绑定,当单击QListWidget列表中的一个条目时会弹出消息框,提示选择的是哪个条目。


实现代码如下所示:

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
class ListWidget(QListWidget):
  def clicked(self,item):
  QMessageBox.information(self, "ListWidget", "你选择了: "+item.text())
if __name__ == '__main__':
  app = QApplication(sys.argv)
  listWidget  = ListWidget()
  listWidget.resize(300,120) 
  listWidget.addItem("Pyhon语言");
  listWidget.addItem("C语言");
  listWidget.addItem("C++语言");
  listWidget.addItem("Java语言");
  listWidget.setWindowTitle('QListwidget 例子')
  listWidget.itemClicked.connect(listWidget.clicked)
  listWidget.show() 
  sys.exit(app.exec_())

4、QTableWidget类

QTableWidget是Qt程序中常用的显示数据表格的空间,类似于C#中的DataGrid。QTableWidget是QTableView的子类,它使用标准的数据模型,并且其单元格数据是通过QTableWidgetltem 对象来实现的。使用QTableWidget时就需要QTableWidgetltem,用来表示表格中的一个单元格,整个表格就是用各单元格构建起来的。


QTableWidget类中的常用方法如下表所示:


image.png


编辑规则的枚举值类型如下表所示:


image.png


表格的选择行为的枚举值类型如下表所示:


image.png


单元格文本的水平对齐方式如下表所示:


image.png


单元格文本的垂直对齐方式如下表所示:


image.png


如果要设置水平和垂直对齐方式,比如在表格空间内上、下、左、右居中对齐,那么只要使用Qt.AlignHCenter和Qt.AlignVCenter 即可。


通过示例了解QTableWidget类的使用方法,效果如下所示:


image.png


示例中, 构造了一个QTableWidget对象,并且设置表格为4行3列。生成了一个QTableWidgetltem对象,名称为“不脱发的程序猿”。


实现代码如下所示:


import sys
from PyQt5.QtWidgets import (QWidget, QTableWidget, QHBoxLayout, QApplication, QTableWidgetItem, QAbstractItemView  )
class Table(QWidget):
  def __init__(self):
  super().__init__()
  self.initUI()
  def initUI(self):
  self.setWindowTitle("QTableWidget 例子")
  self.resize(430,230);
  conLayout = QHBoxLayout()
  tableWidget = QTableWidget()
  tableWidget.setRowCount(4)
  tableWidget.setColumnCount(3)
  conLayout.addWidget(tableWidget )
  tableWidget.setHorizontalHeaderLabels(['姓名','性别','体重(kg)'])  
  newItem = QTableWidgetItem("不脱发的程序猿")  
  tableWidget.setItem(0, 0, newItem)  
  newItem = QTableWidgetItem("男")  
  tableWidget.setItem(0, 1, newItem)  
  newItem = QTableWidgetItem("65")  
  tableWidget.setItem(0, 2, newItem)   
  # 将表格变为禁止编辑
  #tableWidget.setEditTriggers(QAbstractItemView.NoEditTriggers)
  # 设置表格为整行选择
  #tableWidget.setSelectionBehavior( QAbstractItemView.SelectRows)
  # 将行和列的大小设为与内容相匹配
  #tableWidget.resizeColumnsToContents()
  #tableWidget.resizeRowsToContents()
  #表格表头的显示与隐藏
  #tableWidget.verticalHeader().setVisible(False)
  #tableWidget.horizontalHeader().setVisible(False)
  # 不显示表格单元格的分割线
  #tableWidget.setShowGrid(False)
                # 不显示垂直表头
  tableWidget.verticalHeader().setVisible(False)
  self.setLayout(conLayout)
if __name__ == '__main__':
  app = QApplication(sys.argv)
  example = Table()  
  example.show()   
  sys.exit(app.exec_())

5、QTreeWidget和QTreeWidgetltem类

QTreeWidget类实现了树形结构,效果如下图所示:


image.png


QTreeWidget类中的常用方法如下表所示:


image.png


QTreeWidgetltem类中的常用方法如下表所示:

image.png



通过示例了解QTreeWidget和QTreeWidgetltem类的使用方法,效果如下所示:


image.png


示例中,实现树形结构节点的添加、修改和删除, 实现代码如下所示:


import sys
from PyQt5.QtWidgets import *
#from PyQt5.QtGui import QIcon ,  QBrush , QColor
#from PyQt5.QtCore import Qt 
class TreeWidgetDemo(QWidget):   
  def __init__(self,parent=None):
  super(TreeWidgetDemo,self).__init__(parent)
  self.setWindowTitle('TreeWidget 例子')
  operatorLayout = QHBoxLayout()
  addBtn = QPushButton("添加节点")
  updateBtn =  QPushButton("修改节点")
  delBtn = QPushButton("删除节点")  
  operatorLayout.addWidget(addBtn)
  operatorLayout.addWidget(updateBtn)
  operatorLayout.addWidget(delBtn)
  # 按钮的信号槽连接
  addBtn.clicked.connect(self.addTreeNodeBtn )
  updateBtn.clicked.connect(self.updateTreeNodeBtn )
  delBtn.clicked.connect(self.delTreeNodeBtn )  
  self.tree = QTreeWidget(self)
        # 设置列数
  self.tree.setColumnCount(2)
        # 设置头的标题
  self.tree.setHeaderLabels(['Key','Value'])
  root= QTreeWidgetItem(self.tree)
  root.setText(0,'root')
  root.setText(1,'0')
  child1 = QTreeWidgetItem(root)
  child1.setText(0,'child1')
  child1.setText(1,'1')
  child2 = QTreeWidgetItem(root)
  child2.setText(0,'child2')
  child2.setText(1,'2')
  child3 = QTreeWidgetItem(root)
  child3.setText(0,'child3')
  child3.setText(1,'3')  
  child4 = QTreeWidgetItem(child3)
  child4.setText(0,'child4')
  child4.setText(1,'4')
  child5 = QTreeWidgetItem(child3)
  child5.setText(0,'child5')
  child5.setText(1,'5')
  self.tree.addTopLevelItem(root)
  self.tree.clicked.connect( self.onTreeClicked )
  mainLayout = QVBoxLayout(self);
  mainLayout.addLayout(operatorLayout);
  mainLayout.addWidget(self.tree);  
  self.setLayout(mainLayout)  
  def onTreeClicked(self, qmodelindex):
  item = self.tree.currentItem()
  print("key=%s ,value=%s" % (item.text(0), item.text(1)))
  def addTreeNodeBtn(self):
  print('--- addTreeNodeBtn ---')
  item = self.tree.currentItem()
  node = QTreeWidgetItem(item)
  node.setText(0,'newNode')
  node.setText(1,'10')  
  def updateTreeNodeBtn(self):
  print('--- updateTreeNodeBtn ---')
  item = self.tree.currentItem()
  item.setText(0,'updateNode')
  item.setText(1,'20')  
  def delTreeNodeBtn(self):
  print('--- delTreeNodeBtn ---')
  item = self.tree.currentItem()
  root = self.tree.invisibleRootItem()
  for item in self.tree.selectedItems():
    (item.parent() or root).removeChild(item)
if __name__ == '__main__':
  app = QApplication(sys.argv)
  tree = TreeWidgetDemo()
  tree.show()
  sys.exit(app.exec_())
相关文章
|
1天前
|
设计模式 开发者 Python
Python编程中的设计模式:工厂方法模式###
本文深入浅出地探讨了Python编程中的一种重要设计模式——工厂方法模式。通过具体案例和代码示例,我们将了解工厂方法模式的定义、应用场景、实现步骤以及其优势与潜在缺点。无论你是Python新手还是有经验的开发者,都能从本文中获得关于如何在实际项目中有效应用工厂方法模式的启发。 ###
|
3天前
|
设计模式 监控 数据库连接
Python编程中的设计模式之美:提升代码质量与可维护性####
【10月更文挑战第21天】 一段简短而富有启发性的开头,引出文章的核心价值所在。 在编程的世界里,设计模式如同建筑师手中的蓝图,为软件的设计和实现提供了一套经过验证的解决方案。本文将深入浅出地探讨Python编程中几种常见的设计模式,通过实例展示它们如何帮助我们构建更加灵活、可扩展且易于维护的代码。 ####
|
11天前
|
设计模式 开发者 Python
Python编程中的设计模式:从入门到精通####
【10月更文挑战第14天】 本文旨在为Python开发者提供一个关于设计模式的全面指南,通过深入浅出的方式解析常见的设计模式,帮助读者在实际项目中灵活运用这些模式以提升代码质量和可维护性。文章首先概述了设计模式的基本概念和重要性,接着逐一介绍了几种常用的设计模式,并通过具体的Python代码示例展示了它们的实际应用。无论您是Python初学者还是经验丰富的开发者,都能从本文中获得有价值的见解和实用的技巧。 ####
|
15天前
|
索引 Python
python-类属性操作
【10月更文挑战第11天】 python类属性操作列举
12 1
|
15天前
|
Java C++ Python
Python基础---类
【10月更文挑战第10天】Python类的定义
16 2
|
8天前
|
设计模式 开发者 Python
Python编程中的设计模式应用与实践###
【10月更文挑战第18天】 本文深入探讨了Python编程中设计模式的应用与实践,通过简洁明了的语言和生动的实例,揭示了设计模式在提升代码可维护性、可扩展性和重用性方面的关键作用。文章首先概述了设计模式的基本概念和重要性,随后详细解析了几种常用的设计模式,如单例模式、工厂模式、观察者模式等,在Python中的具体实现方式,并通过对比分析,展示了设计模式如何优化代码结构,增强系统的灵活性和健壮性。此外,文章还提供了实用的建议和最佳实践,帮助读者在实际项目中有效运用设计模式。 ###
10 0
|
11天前
|
设计模式 存储 数据库连接
Python编程中的设计模式之美:单例模式的妙用与实现###
本文将深入浅出地探讨Python编程中的一种重要设计模式——单例模式。通过生动的比喻、清晰的逻辑和实用的代码示例,让读者轻松理解单例模式的核心概念、应用场景及如何在Python中高效实现。无论是初学者还是有经验的开发者,都能从中获得启发,提升对设计模式的理解和应用能力。 ###
|
14天前
|
Linux Android开发 开发者
【Python】GUI:Kivy库环境安装与示例
这篇文章介绍了 Kivy 库的安装与使用示例。Kivy 是一个开源的 Python 库,支持多平台开发,适用于多点触控应用。文章详细说明了 Kivy 的主要特点、环境安装方法,并提供了两个示例:一个简单的 Hello World 应用和一个 BMI 计算器界面。
23 0
|
15天前
|
机器学习/深度学习 算法框架/工具 Python
基于深度学习的手写数字识别项目GUI(Deep Learning Project – Handwritten Digit Recognition using Python)
基于深度学习的手写数字识别项目GUI(Deep Learning Project – Handwritten Digit Recognition using Python)
37 0
WK
|
18天前
|
Python
Python类命名
在Python编程中,类命名至关重要,影响代码的可读性和维护性。建议使用大写驼峰命名法(如Employee),确保名称简洁且具描述性,避免使用内置类型名及单字母或数字开头,遵循PEP 8风格指南,保持项目内命名风格一致。
WK
10 0