最近的实习任务中要求使用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, QtWidgets
class 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.translate
Dialog.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=0
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(1))
# 设置每个位置的文本值
self.model.setItem(row, column, item)
# print(item.text())
# 实例化表格视图,设置模型为自定义的模型
self.tableView.setModel(self.model)
# 设置数据层次结构,4行4列
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 test
if __name__ == '__main__':
app = QApplication(sys.argv)
myWin = MyMainForm()
myWin.show()
sys.exit(app.exec_())