PYQT5(17)-高级界面控件-表格与树
表格与树解决的问题是如何在一个控件中有规律地呈现更多的数据。PyQt提供了两种控件类用于解决该问题,其中一种是表格结构的控件类;另一种是树形结构的控件类。
QTableView
以表格形式输出信息,可以使用自定义的数据模型来显示内容,通过setModel来绑定数据源。
继承结构如下
QTableWidget继承自QTableView,主要区别是QTableView可以使用自定义的数据模型来显示内容(先要通过setModel来绑定数据源), 而QTableWidget 只能使用标准的数据模型,并且其单元格数据是通过QTableWidgetItem对象来实现的。通常使用QTableWidget就能够满足我们的要求。
可用的模式如下
QStringListModel | 存储一组字符串 |
QStandardltemModel | 存储任意层次结构的数据 |
QDirModel | 对文件系统进行封装 |
QSqlQueryModel | 对SQL的查询结果集进行封装 |
QSqITableModel | 对SQL中的表格进行封装 |
QSqIRelationalTableModel | 对带有foreign key 的SQL表格进行封装 |
QSortFilterProxyModel | 对模型中的数据进行排序或过滤 |
代码示例
from 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)# 添加数据self.model.appendRow([QStandardItem("row %s, column %s" % (11, 11)),QStandardItem("row %s, column %s" % (11, 11)),QStandardItem("row %s, column %s" % (11, 11)),QStandardItem("row %s, column %s" % (11, 11)),])# # 下面代码让表格100%填满窗口# self.tableView.horizontalHeader().setStretchLastSection(True)# self.tableView.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)# # 删除当前选中的数据# # 取当前选中的所有行# indexs = self.tableView.selectionModel().selection().indexes()# if len(indexs) > 0:# # 取第一行的索引# index = indexs[0]# self.model.removeRows(index.row(), 1)dlgLayout = QVBoxLayout()dlgLayout.addWidget(self.tableView)self.setLayout(dlgLayout)if __name__ == '__main__':app = QApplication(sys.argv)table = Table()table.show()sys.exit(app.exec_())
QListView
QListView类用于展示数据,它的子类是QListWidget。QListView是基于模型(Model)的,需要程序来建立模型,然后再保存数据。
QListWidget 是一个升级版本的QListView,它已经建立了一个数据存储模型(QListWidgetltem),直接调用addItem()函数,就可以添加条目(Item)。
QListView类中的常用方法
setModel() | 用来设置View所关联的Model,可以使用Python原生的list作为数据源Model |
selectedItem() | 选中Model中的条目 |
isSelected() | 判断Model中的某条目是否被选中 |
QListView类中的常用信号
clicked | 当单击某项时,信号被发射 |
doubleClicked | 当双击某项时,信号被发射 |
代码示例
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QListView, QMessageBox
from PyQt5.QtCore import QStringListModel
import sysclass 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 = ['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_())
QListWidget
QListWidet类是一个基于条目的接口,用于从列表中添加或删除条目。列表中的每个条目都是一个QListWidgetltem对象。QListWidget可以设置为多重选择。
常用方法
addltem() | 在列表中添加QListWidgetltem对象或字符串 |
addltems() | 添加列表中的每个条目 |
insertltem() | 在指定的索引处插入条目 |
clear() | 删除列表的内容 |
setCurrentltem() | 设置当前所选条目 |
sortltems() | 按升序重新排列条目 |
常用信号
currentltemChanged | 当列表中的条目发生改变时发射此信号 |
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()listWidget.resize(300, 120)listWidget.addItem("Item 1");listWidget.addItem("Item 2");listWidget.addItem("Item 3");listWidget.addItem("Item 4");listWidget.setWindowTitle('QListwidget 例子')listWidget.itemClicked.connect(listWidget.clicked)listWidget.show()sys.exit(app.exec_())
QTableWidget
常用表格控件,QTableWidget是QTableView的子类, 它使用标准的数据模型,并且其单元格数据是通过QTableWidgetltem对象来实现的。
常用方法
setRowCount(int row) | 设置QTableWidget表格控件的行数 |
setColumnCount(int col) | 设置QTableWidget表格控件的列数 |
setHorizontalHeaderLabels() | 设置QTableWidget表格控件的水平标签 |
setVerticalHeaderLabels() | 设置QTableWidget表格控件的垂直标签 |
setItem(int, int, QTableWidgetItem) | 在QTableWidget表格控件的每个选项的单元空间里添加控件 |
horizontalHeader() | 获得QTableWidget表格控件的表格头,以便执行隐藏 |
rowCount() | 获得QTableWidget表格控件的行数 |
columnCount() | 获得QTableWidget表格控件的列数 |
setEditTriggers(EditTriggers triggers) | 设置表格是否可编辑。设置编辑规则的枚举值 |
setSelectionBehavior | 设置表格的选择行为 |
setTextAlignment() | 设置单元格内文字的对齐方式 |
setSpan(int row, int column, int rowSpanCount, int columnSpanCount) |
合并单元格,要改变单元格的第row行第column列,要合并 rowSpanCount 行数和columnSpanCount列数。 row:要改变的单元格行数 column:要改变的单元格列数 rowSpanCount:需要合并的行数 columnSpanCount:需要合并的列数 |
setShowGrid() |
在默认情况下,表格的显示是有网格线的。 True:显示网格线 False:不显示网格线 |
setColumn Width(int column, int width) | 设置单元格行的宽度 |
setRowHeight(int row, int height) | 设置单元格列的高度 |
编辑规则的枚举值类型
QAbstractltemView.NoEditTriggers | 0 | 不能对表格内容进行修改 0No |
QAbstractItemView.CurrentChanged | 1 | 任何时候都能对单元格进行修改 1Editing |
QAbstractltemView.DoubleClicked | 2 | 双击单元格 2Editing |
QAbstractItemView.SelectedClicked | 4 | 单击已选中的内容 4Editing |
QAbstractItemView.EditKeyPressed | 8 | 当修改键被按下时修改单元格 8Editing |
QAbstractItemView.AnyKeyPressed | 16 | 按任意键修改单元格 16Editing |
QAbstractltemView.AllEditTriggers | 31 | 包括以上所有条件 31Editing |
表格的选择行为的枚举值类型
QAbstractItemView.SelectItems | 0 | 选中单个单元格 |
QAbstractItemView.SelectRows | 1 | 选中一行 |
QAbstractItemView.SelectColumns | 2 | 选中一列 |
单元格文本的水平对齐方式
Qt.AlignLeft | 将单元格的内容沿单元格的左边缘对齐 |
Qt.AlignRight | 将单元格的内容沿单元格的右边缘对齐 |
Qt.AlignHCenter | 在可用空间中,居中显示在水平方向上 |
Qt.AlignJustify | 将文本在可用空间中对齐,默认是从左到右的 |
单元格文本的垂直对齐方式
Qt.AlignTop | 与顶部对齐 |
Qt.AlignBotom | 与底部对齐 |
Qt.AlignVCenter | 在可用空间中,居中显示在垂直方向上 |
Qt.AlignBaseline | 与基线对齐 |
代码示例1
import sys
from PyQt5.QtWidgets import (QWidget, QTableWidget, QHBoxLayout, QApplication, QTableWidgetItem, QAbstractItemView,QHeaderView)class Table(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):self.setWindowTitle("QTableWidget 例子")self.resize(430, 230)conLayout = QHBoxLayout()# 设置表格尺寸# self.table = QTableWidget(4, 3)tableWidget = QTableWidget()tableWidget.setRowCount(4)tableWidget.setColumnCount(3)conLayout.addWidget(tableWidget)# 设置表头tableWidget.setHorizontalHeaderLabels(['姓名', '性别', '体重(kg)'])tableWidget.setVerticalHeaderLabels(['行1', '行2', '行3', '行4', '行5'])# 设置表头为伸缩模式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)# 将表格变为禁止编辑# 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_())
代码示例2
通过TableWidget.setItem()向单元格中添加PyQt的基本控件。
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_())
代码示例3
在表格中快速定位到指定行,当tableWidget表格的行数很多时,可以通过输入行号进行直接定位并显示,比如输入10,就直接显示第10行。
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()# 滚轮定位过去,快速定位到第11行tableWidget.verticalScrollBar().setSliderPosition(row)if __name__ == '__main__':app = QApplication(sys.argv)example = Table()example.show()sys.exit(app.exec_())
代码示例4
将单元格文本颜色设置为红色,字体加粗
import sys
from PyQt5.QtWidgets import (QWidget, QTableWidget, QHBoxLayout, QApplication, QTableWidgetItem)
from PyQt5.QtGui import QBrush, QColor, QFontclass 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("张三")# 设置字体颜色newItem.setForeground(QBrush(QColor(255, 0, 0)))# 设置字体加粗newItem.setFont(QFont("Times", 12, QFont.Black))# 设置字体右下newItem.setTextAlignment(Qt.AlignRight | Qt.AlignBottom)tableWidget.setItem(0, 0, newItem)newItem = QTableWidgetItem("男")newItem.setFont(QFont("Times", 12, QFont.Black))tableWidget.setItem(0, 1, newItem)newItem = QTableWidgetItem("160")newItem.setForeground(QBrush(QColor(255, 0, 0)))tableWidget.setItem(0, 2, newItem)self.setLayout(conLayout)if __name__ == '__main__':app = QApplication(sys.argv)example = Table()example.show()sys.exit(app.exec_())
代码示例5
设置表格的排序方式
查看Qt的开发文档(https://doc.qt.io/qt-5/qt.html#details),可以看到使用Qt.DescendingOrder表示在单元格内降序排列,使用Qt.AscendingOrder表示在单元格内升序排列。
import sys
from PyQt5.QtWidgets import (QWidget, QTableWidget, QHBoxLayout, QApplication, QTableWidgetItem)
from PyQt5.QtCore import Qtclass 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)newItem = QTableWidgetItem("李四")tableWidget.setItem(1, 0, newItem)newItem = QTableWidgetItem("女")tableWidget.setItem(1, 1, newItem)newItem = QTableWidgetItem("155")tableWidget.setItem(1, 2, newItem)newItem = QTableWidgetItem("王五")tableWidget.setItem(2, 0, newItem)newItem = QTableWidgetItem("男")tableWidget.setItem(2, 1, newItem)newItem = QTableWidgetItem("170")tableWidget.setItem(2, 2, newItem)# Qt.DescendingOrder 降序# Qt.AscendingOrder 升序tableWidget.sortItems(2, Qt.DescendingOrder)self.setLayout(conLayout)if __name__ == '__main__':app = QApplication(sys.argv)example = Table()example.show()sys.exit(app.exec_())
代码示例6
合并单元格,将表格中第一行第一列的单元格,更改为占据3行1列
import sys
from PyQt5.QtWidgets import (QWidget, QTableWidget, QHBoxLayout, QApplication, QTableWidgetItem)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)'])tableWidget.setSpan(0, 0, 3, 1)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_())
代码示例7
设置单元格大小
import sys
from PyQt5.QtWidgets import (QWidget, QTableWidget, QHBoxLayout, QApplication, QTableWidgetItem)class Table(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):self.setWindowTitle("QTableWidget 例子")self.resize(530, 300);conLayout = QHBoxLayout()tableWidget = QTableWidget()tableWidget.setRowCount(4)tableWidget.setColumnCount(3)conLayout.addWidget(tableWidget)tableWidget.setHorizontalHeaderLabels(['姓名', '性别', '体重(kg)'])newItem = QTableWidgetItem("张三")tableWidget.setItem(0, 0, newItem)# 将第1列的单元格,设置成150宽度tableWidget.setColumnWidth(0, 150)# 将第1行的单元格,设置成120的高度tableWidget.setRowHeight(0, 120)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_())
代码示例8
在单元格内添加图片,并显示图片的描述信息
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *class Table(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):self.setWindowTitle("QTableWidget 例子")self.resize(500, 300);conLayout = QHBoxLayout()self.tableWidget = QTableWidget()self.tableWidget.setRowCount(5)self.tableWidget.setColumnCount(4)conLayout.addWidget(self.tableWidget)self.tableWidget.setHorizontalHeaderLabels(['姓名', '性别', '体重', '显示图片'])self.tableWidget.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)newItem = QTableWidgetItem("张三")self.tableWidget.setItem(0, 0, newItem)newItem = QTableWidgetItem("男")self.tableWidget.setItem(0, 1, newItem)newItem = QTableWidgetItem("160")self.tableWidget.setItem(0, 2, newItem)newItem = QTableWidgetItem(QIcon("./images/bao1.png"), "背包")self.tableWidget.setItem(0, 3, newItem)self.setLayout(conLayout)if __name__ == '__main__':app = QApplication(sys.argv)example = Table()example.show()sys.exit(app.exec_())
代码示例9
改变单元格中显示图片的大小
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *class Table(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):self.setWindowTitle("QTableWidget 例子")self.resize(1000, 900);conLayout = QHBoxLayout()table = QTableWidget()table.setColumnCount(3)table.setRowCount(5)table.setHorizontalHeaderLabels(['图片1', '图片2', '图片3'])table.setEditTriggers(QAbstractItemView.NoEditTriggers)table.setIconSize(QSize(300, 200));for i in range(3): # 让列宽和图片相同table.setColumnWidth(i, 300)for i in range(5): # 让行高和图片相同table.setRowHeight(i, 200)for k in range(15): # 27 examples of DDAi = k / 3j = k % 3item = QTableWidgetItem()item.setFlags(Qt.ItemIsEnabled) # 用户点击时表格时,图片被选中icon = QIcon(r'.\images\bao%d.png' % k)item.setIcon(QIcon(icon))print('e/icons/%d.png i=%d j=%d' % (k, i, j))table.setItem(i, j, item)conLayout.addWidget(table)self.setLayout(conLayout)if __name__ == '__main__':app = QApplication(sys.argv)example = Table()example.show()sys.exit(app.exec_())
通过实现itemClicked (QTableWidgetItem *)信号的槽函数,可以获得所点击的单元格的引用,进而获得其中的内容。以下代码将itemClicked信号与getltem()函数进行绑定
tableWidget.itemClicked.connect(self.handleItemClick)def getItem(self, item):print("你选择的=>" + item.text())
代码示例10
支持右键菜单
import sys
from PyQt5.QtWidgets import (QMenu, QPushButton, QWidget, QTableWidget, QHBoxLayout, QApplication, QTableWidgetItem,QHeaderView)
from PyQt5.QtCore import QObject, Qtclass Table(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):self.setWindowTitle("QTableWidget 例子")self.resize(500, 300)conLayout = QHBoxLayout()self.tableWidget = QTableWidget()self.tableWidget.setRowCount(5)self.tableWidget.setColumnCount(3)conLayout.addWidget(self.tableWidget)self.tableWidget.setHorizontalHeaderLabels(['姓名', '性别', '体重'])self.tableWidget.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)newItem = QTableWidgetItem("张三")self.tableWidget.setItem(0, 0, newItem)newItem = QTableWidgetItem("男")self.tableWidget.setItem(0, 1, newItem)newItem = QTableWidgetItem("160")self.tableWidget.setItem(0, 2, newItem)# 表格中第二行记录newItem = QTableWidgetItem("李四")self.tableWidget.setItem(1, 0, newItem)newItem = QTableWidgetItem("女")self.tableWidget.setItem(1, 1, newItem)newItem = QTableWidgetItem("170")self.tableWidget.setItem(1, 2, newItem)self.tableWidget.setContextMenuPolicy(Qt.CustomContextMenu) ######允许右键产生子菜单self.tableWidget.customContextMenuRequested.connect(self.generateMenu) ####右键菜单self.setLayout(conLayout)def generateMenu(self, pos):# rint( pos)row_num = -1for i in self.tableWidget.selectionModel().selection().indexes():row_num = i.row()if row_num < 2:menu = QMenu()item1 = menu.addAction(u"选项一")item2 = menu.addAction(u"选项二")item3 = menu.addAction(u"选项三")action = menu.exec_(self.tableWidget.mapToGlobal(pos))if action == item1:print('您选了选项一,当前行文字内容是:', self.tableWidget.item(row_num, 0).text(),self.tableWidget.item(row_num, 1).text(), self.tableWidget.item(row_num, 2).text())elif action == item2:print('您选了选项二,当前行文字内容是:', self.tableWidget.item(row_num, 0).text(),self.tableWidget.item(row_num, 1).text(), self.tableWidget.item(row_num, 2).text())elif action == item3:print('您选了选项三,当前行文字内容是:', self.tableWidget.item(row_num, 0).text(),self.tableWidget.item(row_num, 1).text(), self.tableWidget.item(row_num, 2).text())else:returnif __name__ == '__main__':app = QApplication(sys.argv)example = Table()example.show()sys.exit(app.exec_())
QTreeView
树形结构
QTreeWidget类中的常用方法
setColumnWidth(int column, int width) |
将指定列的宽度设置为给定的值 Column,指定的列 Width,指定列的宽度 |
insertTopLevelItems() | 在视图的顶层索引中插入项目列表 |
expandAll() | 展开所有的树形节点 |
invisibleRootItem() | 返回树形控件中不可见的根选项(Root Item) |
selectedltems() | 返回所有选定的非隐藏项目的列表 |
QTreeWidgetItem类中的常用方法
addChild() | 将子项追加到子列表中 |
setText() | 设置显示的节点文本 |
Text() | 返回显示的节点文本 |
setCheckState(column, state) |
设置指定列的选中状态: Qt.Checked,节点选中 Qt.Unchecked,节点未选中 |
sctIcon(column, icon) | 在指定的列中显示图标 |
代码示例1
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_())
核心结构的其他实现方式
self.tree = QTreeWidget()
# 设置列数
self.tree.setcolumncount(2)
# 设置树形控件头部的标题
self.tree.setHeaderLabels(['Key', 'Value'])
# 设置根节点
root= QTreeWidgetItem()
root.setText{0,"root")rootList = []
rootList.append(root)
# 设置树形控件的子节点1
childl = QTreeWidgetItem()
childl.setText(0, 'child1')
child1.setText(l, 'ios')
root.addChild(childl)self.tree.insertToplevelItems(0, rootList)
代码示例2
单击触发树形控件节点响应事件
from PyQt5.QtWidgets import *
import sysclass 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.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)self.setCentralWidget(self.tree)def onTreeClicked(self, qmodelindex):item = self.tree.currentItem()print("key=%s ,value=%s" % (item.text(0), item.text(1)))if __name__ == '__main__':app = QApplication(sys.argv)tree = TreeWidgetDemo()tree.show()sys.exit(app.exec_())
代码示例3
系统定制模式
在上面的例子中,QTreeWidgetltem类的节点是一个个添加的,这样做有时很不方便,特别是当窗口中产生比较复杂的树形结构时,一般都是通过QTreeView类来实现的,而不是QTreeWidget类。QTreeView类与QTreeWidget类最大的区别就是,QTreeView类可以使用操作系统提供的定制模式,比如文件系统盘的树列表。
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *if __name__ == '__main__':app = QApplication(sys.argv)# Window系统提供的模式 model = QDirModel()# 创建一个QtreeView部件 tree = QTreeView()# 为部件添加模式 tree.setModel(model)tree.setWindowTitle("QTreeView 例子")tree.resize(640, 480)tree.show()sys.exit(app.exec_())
PYQT5(17)-高级界面控件-表格与树相关推荐
- PyQt5高级界面控件之QDockWidget
使用PyQt5高级界面控件之QDockWidget实现主页面模块关闭与显示 前言 QDockWidget是一个可以停靠在QMainWindow内的窗口控件,它可以保持在浮动状态或者在指定位置作为子窗口 ...
- PyQt高级界面控件及操作
PyQt高级界面控件 一.表格与树结构 1.表格 1.代码示例 2.代码解析: 3.补充说明属性参数 2.树结构 1.自定义树结构 2.系统定制模式 二.QStackedWidget组件 三.QTab ...
- PyQt5高级界面控件之QTableWidget(四)
QTableWidget 前言 QTableWidget是Qt程序中常用的显示数据表格的控件,类似于c#中的DataGrid.QTableWidget是QTableView的子类,它使用标准的数据模型 ...
- python 动态调整控件大小_python GUI库图形界面开发之PyQt5动态(可拖动控件大小)布局控件QSplitter详细使用方法与实例...
PyQt5动态(可拖动控件大小)布局控件QSplitter简介 PyQt还提供了特殊的布局管理器QSplitter.它可以动态地拖动子控件之间的边界,算是一个动态的布局管理器,QSplitter允许用 ...
- python嵌套html开发gui_python GUI库图形界面开发之PyQt5表单布局控件QFormLayout详细使用方法与实例...
PyQt5布局控件QFormLayout简介 QFormLayout是label-field式的表单布局,顾明思议,就是实现表单方式的布局,表单是提示用户进行交互的一种模式,主要有两列组成,第一列用于 ...
- 基于PyQt5实现界面控件自适应大小
基于PyQt5实现界面控件自适应大小 界面控件自适应大小,点击窗口放大后,界面控件大小随之发生变化. 实现效果 实例1 点击窗口放大后: 实例2
- python界面设计实例qt_python GUI库图形界面开发之PyQt5美化窗体与控件(异形窗体)实例...
在默认情况下,我们使用PyQt5创建出来的窗口和部件都是默认的样式,虽然谈不上很丑,但是也毫无美感可言.其实,在PyQt5中,我们可以有较高的自由度来自定义窗口和各种小部件的样式,通过自定义这些样式, ...
- pyqt5中控件缩放功能_python GUI库图形界面开发之PyQt5动态(可拖动控件大小)布局控件QSplitter详细使用方法与实例...
PyQt5动态(可拖动控件大小)布局控件QSplitter简介 PyQt还提供了特殊的布局管理器QSplitter.它可以动态地拖动子控件之间的边界,算是一个动态的布局管理器,QSplitter允许用 ...
- pyqt5如何循环遍历控件名_PyQt5 控件学习(一个一个学习之QObject对象)
首先我们要知道控件之间的继承结构,并按照它去学习: 下面是基类的继承图: 所以,我们首先学习的是QObject 和 QWidget 这两个,然后再学其他的. 一: QObject 类: 1, 首先看Q ...
最新文章
- 微信公众号为指定openid用户推送消息
- [LeetCode]Add Binary
- wpf 修改label值_WPF 获取动态添加控件的值
- Training RNNs as Fast as CNNs
- Linux工程师新法宝:在Visual Studio上用C++ 写Linux
- linux 启动 x,(1)linux启动过程
- LSI_阵列卡操作手册
- 【250期门诊集锦】痛并快乐着的正则表达式
- 【2030】排队打水问题
- 计算机端口详解(总结)
- 分析CVPR 2019论文关键词,我看到了计算机视觉的最新趋势 | 附代码
- 网络流(17/24)
- 【推荐系统】协同过滤算法
- D3.js学习笔记七:多系列折线图与图例
- brat标注工具知识总结
- iOS Xcode提交IPA时收到苹果邮件ITMS-90338: Non-public API usage
- java毕业设计m和vue的酒店管理系统2021(附源码、数据库)
- 中国类脑计算先行者:在AI“无人区”探路
- iOS端手游和c++交互 lua和c++交互
- 地球系统模式(CESM)实践技术应用