PyQt5之QTableWidget表格数据
QTableWidget是Qt程序中常用的显示数据表格的控件,类似于C#中的DataGrid。QTableWidget是QTableView的子类,它使用标准的数据模型,并且其单元格数据通过QTableWidgetItem来实现。
一、QTableWidget类中的常用方法
方法 | 描述 |
---|---|
setRowCount(int row) | 设置QTableWidget表格控件的行数 |
setColumnCount(int col) | 设置QTableWidget表格控件的列数 |
setHorizontalHeaderLabels() | 设置QTableWidget表格控件的水平标签 |
setVerticalHeaderLabels() | 设置QTableWidget表格控件的垂直标签 |
setItem(int,int,QTableWidgetItem) | 在QTableWidget表格控件的每个选项的单元空间里面添加控件 |
horizontalHeader() | 获得QTableWidget表格控件的表格头,以便执行隐藏 |
rowCount() | 获得QTableWidget表格控件的行数 |
columnCount() | 获得QTableWidget表格控件的列数 |
setEditTriggers(EditTriggers triggers) | 设置表格是否可编辑,设置编辑规则的枚举值 |
setSelectionBehavior() | 设置表格的选择行为 |
setTextAlignment() | 设置单元格内文字的对齐方式 |
setSpan(int row,int column,int rowSpanCount,int columnSpanCount) | 合并单元格。要改变单元格的第row行,第column列,要合并rowSpanCount行数和columnSpanCount列数 |
setShowGrid() | 在默认情况下表格的显示是有网格线的,True(显示网格线),False(不显示) |
setColumnWidth(int column,int width) | 设置单元行格的宽度 |
setRowHeight(int row,int height) | 设置单元列格的高度 |
编辑规则的枚举值类型
选项 | 值 | 描述 |
---|---|---|
QAbstractItemView.NoEditTriggers0No | 0 | 不能对表格内容进行修改 |
QAbstractItemView.CurrentChanged1Editing | 1 | 任何时候都能对单元格进行修改 |
QAbstractItemView.DoubleClicked2Editing | 2 | 双击单元格 |
QAbstractItemView.SelectedClicked4Editing | 4 | 单击已选中的内容 |
QAbstractItemView.EditKeyPressed8Editing | 8 | 当修改键被按下时修改单元格 |
QAbstractItemView.AnyKeyPressed16Editing | 16 | 按任意键修改单元格 |
QAbstractItemView.AllEditTriggers31Editing | 31 | 包括以上所有条件 |
表格的选择行为的枚举值类型
选项 | 值 | 描述 |
---|---|---|
QAbstractItemView.SelectItems0Selecting | 0 | 选中单个单元格 |
QAbstractItemView.SelectRows1Selecting | 1 | 选中一行 |
QAbstractItemView.SelectColumns2Selecting | 2 | 选中一列 |
单元格文本的水平对齐方式
选项 | 描述 |
---|---|
Qt.AlignLeft | 将单元格的内容沿单元格的左边缘对齐 |
Qt.AlignRight | 将单元格的内容沿单元格的右边缘对齐 |
Qt.AlignHCenter | 在可用空间中,居中显示在水平方向上 |
Qt.AlignJustify | 将文本在可用空间中对齐,默认是从左到右的 |
单元格文本的垂直对齐方式
选项 | 描述 |
---|---|
Qt.AlignTop | 与顶部对齐 |
Qt.AlignBottom | 与底部对齐 |
Qt.AlignVCenter | 在可用空间中,居中显示在垂直方向上 |
Qt.AlignBaseline | 与基线对齐 |
二、QTableWidget的基本用法
import sys
from PyQt5 import QtCore
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
class Table(QWidget):
def __init__(self):
super().__init__()
self.setGeometry(300, 300, 500, 400)
self.setWindowTitle('QTableWidget的基本用法')
layout = QHBoxLayout()
table = QTableWidget()
table.setRowCount(4)
table.setColumnCount(3)
layout.addWidget(table)
table.setHorizontalHeaderLabels(['姓名','性别','体重(kg)'])
item1 = QTableWidgetItem('张三')
table.setItem(0,0,item1)
item2 = QTableWidgetItem('男')
table.setItem(0, 1, item2)
item3 = QTableWidgetItem('50')
table.setItem(0, 2, item3)
self.setLayout(layout)
if __name__ == "__main__":
app = QApplication(sys.argv)
form = Table()
form.show()
sys.exit(app.exec_())
运行效果如下:
- 设置表格头
#初始化
table = QTableWidget()
table.setRowCount(4)
table.setColumnCount(3)
#设置表格水平表头标签和垂直表头标签
table.setHorizontalHeaderLabels(['姓名','性别','体重(kg)'])
table.setVerticalHeaderLabels([1,2,3,4])
- 设置表格头为伸缩模式
#可根据窗口大小来改变网格的大小
table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
- 将表格变为禁止编辑
#只读不可修改
table.setEditTriggers(QAbstractItemView.NoEditTriggers)
- 设置表格整行选中
table.setSelectionBehavior(QAbstractItemView.SelectRows)
- 将行和列的高度、宽度设置为与所显示内容的宽度、高度相匹配
table.resizeRowsToContents()
table.resizeColumnsToContents()
- 表格头的显示与隐藏
#垂直方向
table.verticalHeader().setVisible(False)
#水平方向
table.horizontalHeader().setVisible(False)
- 在单元格中放置控件
btn = QPushButton('修改')
btn.setDown(True)
#修改按钮大小
btn.setStyleSheet("QPushButton{margin:3px};")
#将按钮添加到单元格
table.setCellWidget(1,0,btn)
- 在表格中快速定位到指定行
#遍历表格查找对应的具体单元格,text为查找的项
item = table.findItems(text,QtCore.Qt.MatchExactly)
#获取行号
row = item[0].row()
#模拟鼠标滚轮快速定位到指定行
table.verticalScrollBar().setSliderPosition(row)
三、设置单元格
- 设置单元格文本颜色和字体加粗
item1 = QTableWidgetItem('张三')
#设置文本颜色
item1.setForeground(QBrush(QColor(255,0,0)))
#设置字体加粗和大小
item1.setFont(QFont("Times",12,QFont.Black))
table.setItem(0,0,item1)
- 设置单元格的排序方式
#QtCore.Qt.AscendingOrder升序
#QtCore.Qt.DescendingOrder降序
#对应的属性含义为:需要排序的列,排序方式
table.sortItems(2,QtCore.Qt.DescendingOrder)
- 设置单元格文本的对齐方式
#设置单元格内容右对齐并与底部对齐
item1.setTextAlignment(Qt.AlignRight|Qt.AlignBottom)
- 合并单元格
#设置第一行第一列的单元格占据3行1列
table.setSpan(0,0,3,1)
- 设置单元格大小
#将第一列的单元格宽度设置为150
table.setColumnWidth(0,150)
#将第一列的高度设置为120
table.setRowHeight(0,120)
- 为单元格添加图片
item = QTableWidgetItem(QIcon('图片路径','图片名称'))
- 获得单元格内容
table.itemClicked.connect(self.click)
def click(self,item):
print('you selected =>'+item.text())
四、支持右键菜单
import sys
from PyQt5 import QtCore
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
class Table(QWidget):
def __init__(self):
super().__init__()
self.setGeometry(300, 300, 500, 400)
self.setWindowTitle('QTableWidget的基本用法')
layout = QHBoxLayout()
self.table = QTableWidget()
self.table.setRowCount(4)
self.table.setColumnCount(3)
layout.addWidget(self.table)
self.table.setHorizontalHeaderLabels(['姓名','性别','体重(kg)'])
item1 = QTableWidgetItem('张三')
self.table.setItem(0,0,item1)
item2 = QTableWidgetItem('男')
self.table.setItem(0, 1, item2)
item3 = QTableWidgetItem('50')
self.table.setItem(0, 2, item3)
item4 = QTableWidgetItem('王五')
self.table.setItem(1, 0, item4)
item5 = QTableWidgetItem('女')
self.table.setItem(1, 1, item5)
item6 = QTableWidgetItem('60')
self.table.setItem(1, 2, item6)
self.setLayout(layout)
#允许右键产生菜单
self.table.setContextMenuPolicy(Qt.CustomContextMenu)
#将右键菜单绑定槽函数
self.table.customContextMenuRequested.connect(self.Menu)
def Menu(self,pos):
row_num = -1
for i in self.table.selectionModel().selection().indexes():
row_num = i.row()
# 表格中只有两行数据,所以只在前两行支持右键弹出菜单
if row_num < 2:
menu = QMenu()
item1 = menu.addAction(u'选项1')
item2 = menu.addAction(u'选项2')
item3 = menu.addAction(u'选项3')
action = menu.exec_(self.table.mapToGlobal(pos))
if __name__ == "__main__":
app = QApplication(sys.argv)
form = Table()
form.show()
sys.exit(app.exec_())
运行效果如下: