pyqt讲解7:表格和树
表格和树的作用就是在一个控件中有规律得呈现更多的数据,因此 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:表格和树相关推荐
- Python Qt GUI设计:QTableView、QListView、QListWidet、QTableWidget、QTreeWidget和QTreeWidgetltem表格和树类(提升篇—1)
目录 1.QTableView类 2.QListView类 3.QListWidet类 4.QTableWidget类 5.QTreeWidget和QTreeWidgetltem类 表格与树解决的问题 ...
- PyQt5快速开发与实战 5.1 表格与树
PyQt5快速开发与实战 文章目录 PyQt5快速开发与实战 5. 第5章 PyQt5 高级界面控件 5.1 表格与树 5.1.1 QTableView 5.1.2 QListView 5.1.3 Q ...
- PYQT5(17)-高级界面控件-表格与树
表格与树解决的问题是如何在一个控件中有规律地呈现更多的数据.PyQt提供了两种控件类用于解决该问题,其中一种是表格结构的控件类:另一种是树形结构的控件类. QTableView 以表格形式输出信息,可 ...
- 美赛LaTeX关键操作讲解--绘制表格,插入图片、公式、代码块
后天2022年美赛就开始了,针对写作要求,博主着重整理了一下运用LaTeX绘制表格,插入图片.公式的详细操作以及相应的注释要求.(以下代码直接复制便可以使用,编号格式方面以及设置好了) 希望大家都能在 ...
- RK3399平台开发系列讲解(内核设备树篇)3.25、WIFI设备树的解析
平台 内核版本 安卓版本 RK3399 Linux4.4 Android7.1
- RK3399平台开发系列讲解(内核设备树原理)3.9、内核启动阶段获得dtb位置指针过程介绍
- RK3399平台开发系列讲解(内核设备树篇)3.10、ADC驱动树的配置及解析
平台 内核版本 安卓版本 RK3399 Linux4.4 Android7.1
- JAVA里点击树与表格结合,javaswing中的表格(jtable)和树(jtree)组件使用实例.doc
javaswing中的表格(jtable)和树(jtree)组件使用实例.doc JAVASWING中的表格JTABLE和树JTREE组件使用实例这篇文章主要介绍了JAVASWING中的表格JTABL ...
- vue+element实现树状表格的增删改查;使用el-table树形数据与懒加载实现树状表格增删改查
以下代码可以直接复制使用 一.情景: 列表是一个树状表格,可以无限添加下级,以及对列表的某一行进行增删改查(目前查没有写). 原博链接 二.本篇是在原博主的代码基础上添加了部分功能. 功能1: 给树状 ...
最新文章
- SpringBoot集成OpenOffice实现doc文档转html
- 【Android】adb架构(客户端(shell/ddms/adt)+本地服务器+daemon)
- 利用 Node.js 实现 SAP Hana 数据库编程接口
- [AGC009B] Tournament(多叉树转二叉树后的最小可能深度)
- Jquery Datatable 数据填充报错:requested unknown parameter ‘XXX‘ for row xx, column xx 解决方法
- shiro 升级_小米11消息再次确认:骁龙875有独占期,超广角镜头大升级
- Linux进程间通信之管道(pipe)、命名管道(FIFO)与信号(Signal)
- 个人管理:发掘自己的性格优势
- css滤镜使文字变3D效果
- Zabbix 4.0升级5.0 ES 6.1升级7.0
- NHibernate.Cfg.HibernateConfigException
- spring 数组中随机取几个_最新redux-spring前端模块化框架
- 面试遇Spark,别怂!
- uipath 收邮件_UIpath 循环读取IMAP邮件,并保存附件
- codepush 微软服务器,ionic3 code-push 搭建自己服务器的问题
- 计算机怎样打开鼠标点的键盘,电脑软键盘怎么打?
- python 拆分excel单元格_如何用Python拆分合并后的Excel单元格?
- 牛客剪刀石头布Java 模拟+贪心
- 【ACWing】2188. 无源汇上下界可行流
- 中国“神舟八号”飞船在酒泉发射升空
热门文章
- Python——科赫曲线绘制
- 怎么改服务器php文件,自定义更改服务器asp/php/.net等文件后缀名
- wordpress 主机伪静态404.php seo,wordpress开启伪静态之后,出现404是什么原因?
- 【jetsonnano】jetsonnano串口通信与esp8266 cutecom和minicom使用
- JQuery-学习笔记07【高级——JQuery高级案例】
- 关于redis的文章
- Kotlin实战指南一:集合
- SDUT-SQL题解
- linux设备驱动学习(一)——简单的helloworld模块
- Android 优化电池使用时间 ——监控电池电量和充电状态