PyQt tableview使用方法

最近的实习任务中要求使用pytq进行qgis的二次开发,在这个过程中那我们用到了tableview这个插件,对于这个插件,我们要求通过选择事件在tableview里面显示数据,更改表格数据并获取更改后的数据,下面我将逐步介绍如何实现此操作:

使用QT designer设计一个table view控件,如下图所示:
在这里插入图片描述
上面两个按钮,一个用来生成数据、一个用来获取数据;
在设计完成ui界面以后,接下来我们要将ui界面转换成py文件;我们ui.py文件内容如下:

// ui.py
# -*- coding: utf-8 -*-# Form implementation generated from reading ui file 'untitled2.ui'
#
# Created by: PyQt5 UI code generator 5.13.0
#
# WARNING! All changes made in this file will be lost!from PyQt5 import QtCore, QtGui, QtWidgetsclass Ui_Dialog(object):def setupUi(self, Dialog):Dialog.setObjectName("Dialog")Dialog.resize(385, 300)self.verticalLayoutWidget = QtWidgets.QWidget(Dialog)self.verticalLayoutWidget.setGeometry(QtCore.QRect(20, 10, 351, 291))self.verticalLayoutWidget.setObjectName("verticalLayoutWidget")self.verticalLayout = QtWidgets.QVBoxLayout(self.verticalLayoutWidget)self.verticalLayout.setContentsMargins(0, 0, 0, 0)self.verticalLayout.setObjectName("verticalLayout")self.tableView = QtWidgets.QTableView(self.verticalLayoutWidget)self.tableView.setObjectName("tableView")self.verticalLayout.addWidget(self.tableView)self.pushButton = QtWidgets.QPushButton(self.verticalLayoutWidget)self.pushButton.setObjectName("pushButton")self.verticalLayout.addWidget(self.pushButton)self.pushButton_2 = QtWidgets.QPushButton(self.verticalLayoutWidget)self.pushButton_2.setObjectName("pushButton_2")self.verticalLayout.addWidget(self.pushButton_2)self.retranslateUi(Dialog)QtCore.QMetaObject.connectSlotsByName(Dialog)def retranslateUi(self, Dialog):_translate = QtCore.QCoreApplication.translateDialog.setWindowTitle(_translate("Dialog", "Dialog"))self.pushButton.setText(_translate("Dialog", "PushButton"))self.pushButton_2.setText(_translate("Dialog", "getnum"))

生成py文件以后,接下来我们设计一个models,该模型为表格模型,代码如下:

// 生成一个四行两列的模型
self.model = QStandardItemModel(4, 2)
// 设置水平方向两个头标签文本内容
self.model.setHorizontalHeaderLabels(['old', 'new'])

接下来我们将为模型的每一行进行赋值:

// An highlighted block
arr=['jak','tom']for row in range(4):for column in range(2)//设置文本内容item = QStandardItem(str(arr[colnum]))
//设置每个位置的文本值self.model.setItem(row, column, item)

到了这一步,我们的model就以经设计好了,接下来就只要吧model放在tableview里面显示即可:

//实例化表格视图,设置模型为自定义的模型
self.tableView.setModel(self.model)

到了这一步,我们的表格数据就已经可以显示出来了,下面我将介绍如何读取表格中的数据
要获取表格里面的所有数据,首先要获取表格具有多少行:
myrow=self.tableView.model().rowCount()
然后生成二维数组用以存储数据
test = [[0] * 2 for _ in range(myrow)]
接下来便可读取数据了:
for row in range(myrow):
for colnum in range(2):
test[row][colnum]=self.tableView.model().item(row, colnum).text()

对于本部分我的代码如下:

 def getnum(self):myrow=self.tableView.model().rowCount()test = [[0] * 2 for _ in range(myrow)]for row in range(myrow):for colnum in range(2):test[row][colnum]=self.tableView.model().item(row, colnum).text()# print(test)return test

我的主文件代码如下:

# -*- coding: utf-8 -*-# Form implementation generated from reading ui file 'connect_me.ui'
#
# Created by: PyQt5 UI code generator 5.11.3
#
# WARNING! All changes made in this file will be lost!
#导入程序运行必须模块
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import QColor, QBrush
from ui import Ui_Dialogui
import sys
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *class MyMainForm(QMainWindow, Ui_Dialog):def __init__(self, parent=None):super(MyMainForm, self).__init__(parent)self.setupUi(self)# n=5# self.tableWidget.setRowCount(n)# 设置标题与初始大小# self.setWindowTitle('QTableView表格视图的例子')# self.resize(500, 300)n=0self.model = QStandardItemModel(4, 2)# 设置水平方向四个头标签文本内容self.model.setHorizontalHeaderLabels(['old', 'new'])# #Todo 优化2 添加数据# 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)),# ])for row in range(4):for column in range(2):item = QStandardItem(str(1))# 设置每个位置的文本值self.model.setItem(row, column, item)# print(item.text())# 实例化表格视图,设置模型为自定义的模型self.tableView.setModel(self.model)# 设置数据层次结构,44列self.pushButton.clicked.connect(lambda: self.adddata(n))self.pushButton_2.clicked.connect(lambda: self.getnum())def adddata(self,n):mydata=self.getnum()print(mydata)self.model = QStandardItemModel(4, 2)# 设置水平方向四个头标签文本内容self.model.setHorizontalHeaderLabels(['old', 'new'])# #Todo 优化2 添加数据# 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)),# ])for row in range(4):for column in range(2):item = QStandardItem(str(2))# 设置每个位置的文本值self.model.setItem(row, column, item)# print(item.text())# 实例化表格视图,设置模型为自定义的模型self.tableView.setModel(self.model)# print(self.tableView.model().rowCount())# test = [[0] * 2 for _ in range(4)]# test[0][1]=1# test[1][0]=1# print(test)# #todo 优化1 表格填满窗口# #水平方向标签拓展剩下的窗口部分,填满表格# self.tableView.horizontalHeader().setStretchLastSection(True)# #水平方向,表格大小拓展到适当的尺寸# self.tableView.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)## #TODO 优化3 删除当前选中的数据# indexs=self.tableView.selectionModel().selection().indexes()# print(indexs)# if len(indexs)>0:#     index=indexs[0]#     self.model.removeRows(index.row(),1)# 设置布局def getnum(self):myrow=self.tableView.model().rowCount()test = [[0] * 2 for _ in range(myrow)]for row in range(myrow):for colnum in range(2):test[row][colnum]=self.tableView.model().item(row, colnum).text()# print(test)return testif __name__ == '__main__':app = QApplication(sys.argv)myWin = MyMainForm()myWin.show()sys.exit(app.exec_())


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部