QTableView类用于以表格形式输出信息,可通过自定义的数据模型来显示数据,通过setModel来绑定数据源。
创建一个表格视图
self.table_view = QTableView()
设置表格标题栏的字体
font = self.table_view.horizontalHeader().font() # 获取当前表格标题栏的字体
font.setFamily("微软雅黑") # 修改字体样式
self.table_view.horizontalHeader().setFont(font) # 重新设置新的字体
设置表格标题是否可见(True: 可见,False:不可见)
self.table_view.verticalHeader().setVisible(False) # 垂直标题栏不可见
self.table_view.horizontalHeader().setVisible(False) # 水平标题栏不可见
设置表格标题栏是否可被点击
self.table_view.verticalHeader().setSectionsClickable(False) # 垂直标题栏不可被点击
self.table_view.horizontalHeader().setSectionsClickable(False) # 水平标题栏不可被点击
设置表格标题栏的背景色
self.table_view.horizontalHeader().setStyleSheet("QHeaderView::section{background:red;}") # 垂直标题栏背景色为红色
设置表格标题栏的高度
self.table_view.horizontalHeader().setFixedHeight(40)
拖动表格标题栏移动行列
self.table_view.horizontalHeader().setSectionsMovable(True); # 设置可拖动
self.table_view.horizontalHeader().setDragEnabled(True); # 启动拖动
self.table_view.horizontalHeader().setDragDropMode(QAbstractItemView.InternalMove) # 设置拖动模式
设置行列填满窗口
self.table_view.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch) # 使表宽度自适应
self.table_view.verticalHeader().setSectionResizeMode(QHeaderView.Stretch) # 使表高度自适应
设置内容与表格相匹配(当设置填满窗口时 就不可以拉伸表头)
self.table_view.resizeColumnsToContents()
self.table_view.resizeRowsToContents()
当一个单元格的内容很长时 通过设置表头来显示完整的单元格内容
self.table_view.horizontalHeader().setSectionResizeMode(QHeaderView.ResizeToContents)
设置单元格的选中模式(QAbstractItemView共有五种选中模式)
self.table_view.setSelectionMode(QAbstractItemView.SingleSelection) # 选中一个单元格
五种选中模式如下:
模式 |
说明 |
QAbstractItemView.NoSelection |
禁止选择 |
QAbstractItemView.SingleSelection |
选中单个目标 |
QAbstractItemView.MultiSelection |
选中多个目标 |
QAbstractItemView.ExtendedSelection |
shift键的连续选择 |
QAbstractItemView.ContiguousSelection |
ctrl键的不连续的多个选择 |
禁止编辑(QAbstractItemView有七种编辑模式)
self.table_view.setEditTriggers(QAbstractItemView.NoEditTriggers)
七种编辑模式如下:
模式 |
值 |
说明 |
QAbstractItemView.NoEditTriggers |
0 |
禁止编辑 |
QAbstractItemView.CurrentChanged |
1 |
选择视图中新的数据时触发编辑 |
QAbstractItemView.DoubleClicked |
2 |
鼠标双击时触发编辑 |
QAbstractItemView.SelectedClicked |
4 |
在一个已经选中的行中单击鼠标时触发编辑 |
QAbstractItemView.EditKeyPressed |
8 |
在一个视图选中行中点击鼠标时触发编辑 |
QAbstractItemView.AnyKeyPressed |
16 |
在当前选中的数据(单元格)按下任意键触发当前数据项进入编辑状态 |
QAbstractItemView.AllEditTriggers |
31 |
以上所有操作行为都触发当前数据项进入编辑状态 |
设置选中背景色
self.table_view.setStyleSheet("selection-background-color:lightblue;")
设置是否启用滚动条
self.table_view.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOn) # 启用水平滚动条
self.table_view.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) # 禁用水平滚动条
设置单元格的尺寸
self.table_view.setColumnWidth(0, 100) # (固定值0,宽度)
self.table_view.currentIndex().row() # 获取所在行数
self.table_view.currentIndex().column() # 获取所在列数
获得单元格的内容
self.table_view.currentIndex().data()
4常用操作
设置列名
self.model = QStandardItemModel()
# 设置水平方向四个头标签文本内容
self.model.setHorizontalHeaderLabels(['序号', '姓名'])
添加一行:
# 添加一行
item = QStandardItem("1")
self.model.setItem(0, 0, item)
item = QStandardItem("张三")
self.model.setItem(0, 1, item)
item = QStandardItem("2")
self.model.setItem(1, 0, item)
item = QStandardItem("张四")
self.model.setItem(1, 1, item)
删除指定行
self.model.removeRow(1)
修改某行某列
item = QStandardItem("3")
self.model.setItem(0, 0, item)
统计有多少行
count = self.model.rowCount()
print(count)
清空列表包括列名
self.model.clear()
清空列表不包括列名
self.model.setRowCount(0)
演示代码如下:
# -*- coding: utf-8 -*-
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtGui import QStandardItem, QStandardItemModel
from PyQt5.QtWidgets import QHeaderView
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(800, 600)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.tableView = QtWidgets.QTableView(self.centralwidget)
self.tableView.setGeometry(QtCore.QRect(50, 20, 651, 491))
self.tableView.setObjectName("tableView")
self.model = QStandardItemModel()
# 设置水平方向四个头标签文本内容
self.model.setHorizontalHeaderLabels(['序号', '姓名'])
# 添加一行
item = QStandardItem("1")
self.model.setItem(0, 0, item)
item = QStandardItem("张三")
self.model.setItem(0, 1, item)
item = QStandardItem("2")
self.model.setItem(1, 0, item)
item = QStandardItem("张四")
self.model.setItem(1, 1, item)
# #删除一行
# self.model.removeRow(1)
#修改某一行
item = QStandardItem("3")
self.model.setItem(0, 0, item)
#统计有多少行
count = self.model.rowCount()
print(count)
# #清空所有行包括列名
# self.model.clear()
#清空所有行不包括列名
self.model.setRowCount(0)
# QTableView 绑定 数据
self.tableView.setModel(self.model)
# 水平方向标签拓展剩下的窗口部分,填满表格
self.tableView.horizontalHeader().setStretchLastSection(True)
# 水平方向,表格大小拓展到适当的尺寸
self.tableView.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 30))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())