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, 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)

        # 设置数据层次结构,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 test

if __name__ == '__main__':
    app = QApplication(sys.argv)
    myWin = MyMainForm()
    myWin.show()
    sys.exit(app.exec_())
  • 5
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值