表格和树的作用就是在一个控件中有规律得呈现更多的数据,因此 PyQt5 提供了表格结构和树形结构的控件类。

一.表格

1、QTableView

QTableView 用于将数据(数组、列表)以表格的形式呈现在界面中;QTableView 类中可以使用自定义数据模型来显示内容,通过 setModel 绑定数据源。
QTableWidget 继承自 QTableView,区别在于 QTableView 可以使用自定义数据模型来显示内容,而 QTableWidget 只能使用标准的数据模型,并且单元格数据是人通过 QTableWidgetItem 对象来实现的。
QTable 控件可以绑定一个模型数据来更新控件上的内容,可用的模式如下表:

名称 含义
QStringListModel :存储一组字符串
QStandardItemModel :存储任意层次结构的数据
QDirModel :对文件系统进行封装
QSqlQueryModel ;对 SQL 的查询结果集进行封装
QSqlTableModel :对 SQL 中的表格进行封装
QSqlRelationTableModel :对带有 foreign key 的 SQL 表格进行封装
QSortFilterProxyModel :对模型中的数据进行排序或过滤

rom PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
import sysclass 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_())

删除当前选中的数据,有下面两种方法:

indexs = self.tableView.selectionModel().selection().indexes()
if len(indexs)>0:
index = indexs[0]
self.model.removeRows(index.row(), 1)
index = self.tableView.currentIndex()
self.model.removeRow(index.row())

2、QListView
QListView 类用于展示数据,子类是 QListWidget。 QListView 是基于模型的。
QListWidget 是 QListView 的升级版,此类已经建立了数据存储模型(QListWidgetItem),直接调用 addItem() 函数添加条目。
QListView 常用方法如下表

方法 描述
setModel() 用来设置 View 所关联的 Model,可以使用 Python 原生的 list 作为数据源 Model
selectedItem() 选中 Model 中的条目
isSelected() 判断 Model 中的条目是否被选中

常用信号

信号 描述
clicked 当单击某项时,触发该信号
doubleClicked 当双击某项时,触发该信号
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();#字符listself.qList = ['Item 1','Item 2','Item 3','Item 4' ]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、QListWidget
常用方法

方法 描述
addItem() 在列表中添加QListWidgetItem对象或字符串
addItems() 添加列表中的每个条目
insertItem() 在指定地索引处插入条目
clear() 删除列表的内容
setCurrentItem() 设置当前所选的条目
sortItems() 按升序重新排列条目

常用信号

方法 描述
currentItemChanged 当列表中的条目发生改变时发射此信号
itemClicked 当点击列表中的条目时发射此信号
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()c=['item5','item6']listWidget.resize(300,120) listWidget.addItem("Item 1");listWidget.addItem("Item 2");listWidget.addItem("Item 3");listWidget.addItem("Item 4");listWidget.addItems(c)listWidget.setWindowTitle('QListwidget 例子')listWidget.itemClicked.connect(listWidget.clicked)listWidget.show() sys.exit(app.exec_())

4、QTableWidget
常用方法

表格编辑类型的枚举常量:

单元格内容对齐方式枚举类型:

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("160")  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_())

import sys
from PyQt5.QtWidgets import (QWidget, QTableWidget, QHBoxLayout, QApplication , QTableWidgetItem, QHeaderView)class Table(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):self.setWindowTitle("QTableWidget demo")self.resize(500,300);conLayout = QHBoxLayout()tableWidget= QTableWidget()tableWidget.setRowCount(4)tableWidget.setColumnCount(3)conLayout.addWidget(tableWidget )tableWidget.setHorizontalHeaderLabels(['姓名','性别','体重(kg)'])  #tableWidget.setVerticalHeaderLabels(['行1','行2','行3','行4' ])        tableWidget.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)newItem = QTableWidgetItem("张三")  tableWidget.setItem(0, 0, newItem)  newItem = QTableWidgetItem("男")  tableWidget.setItem(0, 1, newItem)  newItem = QTableWidgetItem("160")  tableWidget.setItem(0, 2, newItem)   self.setLayout(conLayout)if __name__ == '__main__':app = QApplication(sys.argv)example = Table()  example.show()   sys.exit(app.exec_())

# -*- coding: utf-8 -*- '''【简介】PyQT5中 单元格里面放控件 '''import sys
from PyQt5.QtWidgets import (QWidget, QTableWidget, QHBoxLayout, QApplication, QTableWidgetItem, QAbstractItemView ,QComboBox, QPushButton )class Table(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):self.setWindowTitle("QTableWidget 例子")self.resize(430,300);conLayout = QHBoxLayout()tableWidget = QTableWidget()tableWidget.setRowCount(4)tableWidget.setColumnCount(3)conLayout.addWidget(tableWidget )tableWidget.setHorizontalHeaderLabels(['姓名','性别','体重(kg)'])  newItem = QTableWidgetItem("张三")  tableWidget.setItem(0, 0, newItem)  comBox = QComboBox()comBox.addItem("男")comBox.addItem("女")comBox.setStyleSheet("QComboBox{margin:3px};")tableWidget.setCellWidget(0,1,comBox)searchBtn = QPushButton("修改")  searchBtn.setDown( True )searchBtn.setStyleSheet("QPushButton{margin:3px};")tableWidget.setCellWidget(0, 2, searchBtn) self.setLayout(conLayout)if __name__ == '__main__':app = QApplication(sys.argv)example = Table()  example.show()   sys.exit(app.exec_())

# -*- coding: utf-8 -*-
'''【简介】PyQT5的表格控件选中单元格'''import sys
from PyQt5.QtWidgets import  *
from PyQt5 import QtCore
from PyQt5.QtGui import  QColor , QBrushclass Table(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):self.setWindowTitle("QTableWidget 例子")self.resize(600,800);conLayout = QHBoxLayout()tableWidget = QTableWidget()tableWidget.setRowCount(30)tableWidget.setColumnCount(4)conLayout.addWidget(tableWidget )for i in range(30):for j in range(4):itemContent = '(%d,%d)'% (i,j)  tableWidget.setItem(i,j, QTableWidgetItem( itemContent ) )self.setLayout(conLayout)#遍历表查找对应的itemtext = "(10,1)"items = tableWidget.findItems(text, QtCore.Qt.MatchExactly)             item = items[0]# 选中单元格#item.setSelected( True)# 设置单元格的背景颜色为红色item.setForeground(QBrush(QColor(255, 0, 0))) row = item.row()   #滚轮定位过去,快速定位到第17行tableWidget.verticalScrollBar().setSliderPosition(row)  if __name__ == '__main__':app = QApplication(sys.argv)example = Table()  example.show()   sys.exit(app.exec_())

二.树QTreeWidget

QTreeWidget常用方法

方法 描述
setColumnWidth(int column,int width) 将指定列的宽度设置为给定的值
insertTopLevelItems() 在视图的顶层索引中引入项目的列表
expandAll() 展开所有节点的树形节点
invisibleRootItem() 返回树形控件中不可见的根选项(Root Item)
selectionItems() 返回所有选定的非隐藏项目的列表内

QTreeWidgetItem类中常用的方法

方法 描述
addChild() 将子项追加到子列表中
setText() 设置显示的节点文本
Text() 返回显示的节点文本
setCheckState(column.state) 设置指定列的选中状态:
- Qt.Checked:节点选中
- Qt.Unchecked:节点没有选中
setIcon(column,icon) 在指定的列中显示图标
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import QIcon, QBrush, QColor
from PyQt5.QtCore import Qtclass TreeWidgetDemo(QMainWindow):def __init__(self, parent=None):super(TreeWidgetDemo, self).__init__(parent)self.setWindowTitle('TreeWidget 例子')self.tree = QTreeWidget()# 设置列数self.tree.setColumnCount(2)# 设置头的标题self.tree.setHeaderLabels(['Key', 'Value'])# 设置根节点root = QTreeWidgetItem(self.tree)root.setText(0, 'root')root.setIcon(0, QIcon("./images/root.png"))# 设置列宽self.tree.setColumnWidth(0, 160)### 设置节点的背景颜色# brush_red = QBrush(Qt.red)# root.setBackground(0, brush_red)# brush_green = QBrush(Qt.green)# root.setBackground(1, brush_green)# 设置子节点1child1 = QTreeWidgetItem(root)child1.setText(0, 'child1')child1.setText(1, 'ios')child1.setIcon(0, QIcon("./images/IOS.png"))child1.setCheckState(0, Qt.Checked)# 设置子节点2child2 = QTreeWidgetItem(root)child2.setText(0, 'child2')child2.setText(1, '')child2.setIcon(0, QIcon("./images/android.png"))# 设置子节点3child3 = QTreeWidgetItem(child2)child3.setText(0, 'child3')child3.setText(1, 'android')child3.setIcon(0, QIcon("./images/music.png"))self.tree.addTopLevelItem(root)# 结点全部展开self.tree.expandAll()self.setCentralWidget(self.tree)if __name__ == '__main__':app = QApplication(sys.argv)tree = TreeWidgetDemo()tree.show()sys.exit(app.exec_())

节点绑定方法
child2 = QTreeWidgetItem(root)
括号里有root

优化一:设置节点的状态
这里添加了child1的选中状态

child1.setCheckState(0,Qt.Checked)

优化二:设置节点的背景颜色
这里设置了根节点的背景颜色

brush_red=QBrush(Qt.red)root.setBackground(0,brush_red)brush_blue=QBrush(Qt.blue)root.setBackground(1,brush_blue)

优化3 :添加响应事件

self.tree.clicked.connect( self.onTreeClicked )
def onTreeClicked(self, qmodelindex):item = self.tree.currentItem()print("key=%s ,value=%s" % (item.text(0), item.text(1)))


电气专业的计算机萌新,写博文不容易,如果你觉得本文对你有用,请点个赞支持下,谢谢。

pyqt讲解7:表格和树相关推荐

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

    目录 1.QTableView类 2.QListView类 3.QListWidet类 4.QTableWidget类 5.QTreeWidget和QTreeWidgetltem类 表格与树解决的问题 ...

  2. PyQt5快速开发与实战 5.1 表格与树

    PyQt5快速开发与实战 文章目录 PyQt5快速开发与实战 5. 第5章 PyQt5 高级界面控件 5.1 表格与树 5.1.1 QTableView 5.1.2 QListView 5.1.3 Q ...

  3. PYQT5(17)-高级界面控件-表格与树

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

  4. 美赛LaTeX关键操作讲解--绘制表格,插入图片、公式、代码块

    后天2022年美赛就开始了,针对写作要求,博主着重整理了一下运用LaTeX绘制表格,插入图片.公式的详细操作以及相应的注释要求.(以下代码直接复制便可以使用,编号格式方面以及设置好了) 希望大家都能在 ...

  5. RK3399平台开发系列讲解(内核设备树篇)3.25、WIFI设备树的解析

    平台 内核版本 安卓版本 RK3399 Linux4.4 Android7.1

  6. RK3399平台开发系列讲解(内核设备树原理)3.9、内核启动阶段获得dtb位置指针过程介绍

  7. RK3399平台开发系列讲解(内核设备树篇)3.10、ADC驱动树的配置及解析

    平台 内核版本 安卓版本 RK3399 Linux4.4 Android7.1

  8. JAVA里点击树与表格结合,javaswing中的表格(jtable)和树(jtree)组件使用实例.doc

    javaswing中的表格(jtable)和树(jtree)组件使用实例.doc JAVASWING中的表格JTABLE和树JTREE组件使用实例这篇文章主要介绍了JAVASWING中的表格JTABL ...

  9. vue+element实现树状表格的增删改查;使用el-table树形数据与懒加载实现树状表格增删改查

    以下代码可以直接复制使用 一.情景: 列表是一个树状表格,可以无限添加下级,以及对列表的某一行进行增删改查(目前查没有写). 原博链接 二.本篇是在原博主的代码基础上添加了部分功能. 功能1: 给树状 ...

最新文章

  1. SpringBoot集成OpenOffice实现doc文档转html
  2. 【Android】adb架构(客户端(shell/ddms/adt)+本地服务器+daemon)
  3. 利用 Node.js 实现 SAP Hana 数据库编程接口
  4. [AGC009B] Tournament(多叉树转二叉树后的最小可能深度)
  5. Jquery Datatable 数据填充报错:requested unknown parameter ‘XXX‘ for row xx, column xx 解决方法
  6. shiro 升级_小米11消息再次确认:骁龙875有独占期,超广角镜头大升级
  7. Linux进程间通信之管道(pipe)、命名管道(FIFO)与信号(Signal)
  8. 个人管理:发掘自己的性格优势
  9. css滤镜使文字变3D效果
  10. Zabbix 4.0升级5.0 ES 6.1升级7.0
  11. NHibernate.Cfg.HibernateConfigException
  12. spring 数组中随机取几个_最新redux-spring前端模块化框架
  13. 面试遇Spark,别怂!
  14. uipath 收邮件_UIpath 循环读取IMAP邮件,并保存附件
  15. codepush 微软服务器,ionic3 code-push 搭建自己服务器的问题
  16. 计算机怎样打开鼠标点的键盘,电脑软键盘怎么打?
  17. python 拆分excel单元格_如何用Python拆分合并后的Excel单元格?
  18. 牛客剪刀石头布Java 模拟+贪心
  19. 【ACWing】2188. 无源汇上下界可行流
  20. 中国“神舟八号”飞船在酒泉发射升空

热门文章

  1. Python——科赫曲线绘制
  2. 怎么改服务器php文件,自定义更改服务器asp/php/.net等文件后缀名
  3. wordpress 主机伪静态404.php seo,wordpress开启伪静态之后,出现404是什么原因?
  4. 【jetsonnano】jetsonnano串口通信与esp8266 cutecom和minicom使用
  5. JQuery-学习笔记07【高级——JQuery高级案例】
  6. 关于redis的文章
  7. Kotlin实战指南一:集合
  8. SDUT-SQL题解
  9. linux设备驱动学习(一)——简单的helloworld模块
  10. Android 优化电池使用时间 ——监控电池电量和充电状态