qtableview这个控件可以绑定一个模型数据用来更新控件上的内容
可用的模式有以下几个
// QStringListModel 存储一组字符串
// QStandardItemModel 存储任意层次结构的数据
// QDirModel 对文件系统进行封装
// QSqlQueryModel 对SQL的查询结果集进行封装
// QSqlTableModel 对SQL中的table进行封装
// QSqlRelationalTableModel 对带有foreign key的SQL table进行封装
// QSortFilterProxyModel 对另一个model执行sort and/or filter
下面使用QStandardItemModel这个模型来给QTableView绑定数据
代码示例如下# -*- coding: utf-8 -*-
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
import sys
class myDialog(QDialog):
"""docstring for myDialog"""
def __init__(self, arg=None):
super(myDialog, self).__init__(arg)
self.setWindowTitle("first window")
self.setWindowFlags(Qt.WindowMaximizeButtonHint|Qt.WindowMinimizeButtonHint|Qt.WindowCloseButtonHint)
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)
app = QApplication(sys.argv)
#全局设置QPushButton的背景样式
dlg = myDialog()
dlg.show()
dlg.exec_()
app.exit()
效果如图:
上面的表格并没有填满窗口但是每列可以自由拉动,但是可能会出现滚动条。
有时候我们需要表格100%填满窗口可以添加下面代码#下面代码让表格100填满窗口
self.tableView.horizontalHeader().setStretchLastSection(True)
self.tableView.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
效果图:
下面对列表进行添加和删除
添加数据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)),
])
删除当前选中数据第一种方法#取当前选中的所有行
indexs=self.tableView.selectionModel().selection().indexes()
if len(indexs)>0:
#取第一行
index = indexs[0]
self.model.removeRows(index.row(),1)
第二种方法index=self.tableView.currentIndex()
print(index.row())
self.model.removeRow(index.row())
什么也不选的时候删除第一行也就是索引为0
选中一行的时候就删除选中的那一行
选中多行时就删除最后一行(国为焦点在最后一行)