写点什么

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

  • 2021 年 12 月 04 日
  • 本文字数:4639 字

    阅读完需:约 15 分钟

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

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

1、QTableView 类

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

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

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

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

实现代码如下所示:

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 类中的常用方法如下表所示:

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

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

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

实现代码如下所示:

from PyQt5.QtWidgets import QApplication, QWidget , QVBoxLayout , QListView, QMessageBoxfrom 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 类中的常用方法如下表所示:

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

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

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

实现代码如下所示:

import sysfrom 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 类中的常用方法如下表所示:

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

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

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

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

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

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

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

实现代码如下所示:

import sysfrom 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 类实现了树形结构,效果如下图所示:

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

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

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

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

import sysfrom 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 小时前阅读数: 6
用户头像

【研究方向】物联网、嵌入式、AI、Python 2018.02.09 加入

【公众号】美男子玩编程,关注获取海量资源~

评论

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