QTableWidget是Qt中常用显示数据的表格,类似其他语言中的DataGrid; QTableWidget是QtableView的子类;每个单元格下是一个QTableWidgetItem对象;
常用方法如下:
表格编辑类型的枚举常量:
单元格选中相关枚举类型:
单元格内容对齐方式枚举类型:
例如:
#QTableWidget 控件使用
from PyQt5.QtWidgets import QTableView,QAbstractItemView,QHeaderView,QTableWidget, QTableWidgetItem, QMessageBox,QListWidget,QListWidgetItem, QStatusBar, QMenuBar,QMenu,QAction,QLineEdit,QStyle,QFormLayout, QVBoxLayout,QWidget,QApplication ,QHBoxLayout, QPushButton,QMainWindow,QGridLayout,QLabel
from PyQt5.QtGui import QIcon,QPixmap,QStandardItem,QStandardItemModel,QCursor
from PyQt5.QtCore import QStringListModel,QAbstractListModel,QModelIndex,QSize,Qt
import sys
class WindowClass(QWidget):
def __init__(self,parent=None):
super(WindowClass, self).__init__(parent)
self.layout=QHBoxLayout()
self.resize(400,300)
tableWidget=QTableWidget()
tableWidget.setRowCount(4)#行数
tableWidget.setColumnCount(4)#列数
tableWidget.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)#所有列自动拉伸,充满界面
tableWidget.setSelectionMode(QAbstractItemView.SingleSelection) # 设置只能选中一行
tableWidget.setEditTriggers(QTableView.NoEditTriggers) # 不可编辑
tableWidget.setSelectionBehavior(QAbstractItemView.SelectRows); # 设置只有行选中
self.layout.addWidget(tableWidget)
tableWidget.setHorizontalHeaderLabels(['姓名','地址','年龄','工资']) #横向标题排列,如果使用setVerticalHeaderLabels则是纵向排列标题
items=[['JONES','Beijing','23',2300],['SMITH','SHAngHai','23','3000'],['ZY','Tianjin','23','2000'],['Smith','SJT','22','1030']]
for i in range(len(items)):#注意上面列表中数字加单引号,否则下面不显示(或者下面str方法转化一下即可)
item=items[i]
for j in range(len(item)):
item = QTableWidgetItem(str(items[i][j]))
tableWidget.setItem(i,j,item)
self.setLayout(self.layout)
if __name__=="__main__":
app=QApplication(sys.argv)
win=WindowClass()
win.show()
sys.exit(app.exec_())
以上部分方法是之间使用QTableView组件时使用过的;请注意;
其他设置:
tableWidget.horizontalHeader().setVisible(False)#设置列标题隐藏(针对列标题横向排列)
# tableWidget.verticalHeader().setVisible(False)#设置列标题隐藏(针对列标题纵向排列)
修改上面程序,向单元格中添加控件:
#QTableWidget 控件使用
from PyQt5.QtWidgets import QComboBox,QTableView,QAbstractItemView,QHeaderView,QTableWidget, QTableWidgetItem, QMessageBox,QListWidget,QListWidgetItem, QStatusBar, QMenuBar,QMenu,QAction,QLineEdit,QStyle,QFormLayout, QVBoxLayout,QWidget,QApplication ,QHBoxLayout, QPushButton,QMainWindow,QGridLayout,QLabel
from PyQt5.QtGui import QIcon,QPixmap,QStandardItem,QStandardItemModel,QCursor,QFont,QBrush,QColor
from PyQt5.QtCore import QStringListModel,QAbstractListModel,QModelIndex,QSize,Qt
import sys
class WindowClass(QWidget):
def __init__(self,parent=None):
super(WindowClass, self).__init__(parent)
self.layout=QHBoxLayout()
self.resize(400,300)
tableWidget=QTableWidget()
tableWidget.setRowCount(4)#行数
tableWidget.setColumnCount(4)#列数
tableWidget.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)#所有列自动拉伸,充满界面
tableWidget.setSelectionMode(QAbstractItemView.SingleSelection) # 设置只能选中一行
tableWidget.setEditTriggers(QTableView.NoEditTriggers) # 不可编辑
tableWidget.setSelectionBehavior(QAbstractItemView.SelectRows); # 设置只有行选中, 整行选中
tableWidget.resizeColumnsToContents()#设置列宽高按照内容自适应
tableWidget.resizeRowsToContents()#设置行宽和高按照内容自适应
#tableWidget.horizontalHeader().setVisible(False)#设置列标题隐藏(针对列标题横向排列)
#tableWidget.verticalHeader().setVisible(False)#设置列标题隐藏(针对列标题纵向排列)
self.layout.addWidget(tableWidget)
tableWidget.setHorizontalHeaderLabels(['姓名','地址','年龄','操作']) #横向标题排列,如果使用setVerticalHeaderLabels则是纵向排列标题
items=[['JONES','Beijing','23',''],['SMITH','SHAngHai','23',''],['ZY','Tianjin','23',''],['Smith','SJT','22','']]
for i in range(len(items)):#注意上面列表中数字加单引号,否则下面不显示(或者下面str方法转化一下即可)
item=items[i]
for j in range(len(item)):
#-----------------------------修改后程序,最后一列添加按钮-------------------#
if j!=3:
item = QTableWidgetItem(str(items[i][j]))
tableWidget.setItem(i, j, item)
else: #最后一列添加控件
btn = QPushButton("删除")
btn.setDown(True)
btn.setStyleSheet("QPushButton{margin:3px};")
tableWidget.setCellWidget(i, j, btn)
#--------------------------------------------------------------------------#
#------------------------------0,1位置添加下拉列表框----------------------#
#某个单元格设置为控件
comBox=QComboBox()
comBox.addItem("北京")
comBox.addItems(["上海","天津"])
comBox.setStyleSheet("QComboBox{margin:3px};")
tableWidget.setCellWidget(0,1,comBox)
#------------------------------------------------------------------------#
#字体设置
newItem=tableWidget.item(0,0)
newItem.setFont(QFont("Times",12,QFont.Black))#字体样式加粗
newItem.setForeground(QBrush(QColor(255,0,0)))#字体颜色
#设置排序
tableWidget.sortItems(1,Qt.AscendingOrder)#Qt.DescendingOrder 升序降序
item_00=tableWidget.item(0,0)
item_00.setTextAlignment(Qt.AlignRight)#Qt.AlignCenter ...
#合并单元格
tableWidget.setSpan(0,0,3,1)
#单元格宽高设置
tableWidget.setColumnWidth(0,150)#第一个参数为行下标
tableWidget.setRowHeight(0,40)
#设置不显示分割线
tableWidget.setShowGrid(False)
#单元格设置图片
tableWidget.setItem(1,1,QTableWidgetItem(QIcon("./image/add.ico"),"百度"))
tableWidget.setItem(0,0,newItem)
self.setLayout(self.layout)
if __name__=="__main__":
app=QApplication(sys.argv)
win=WindowClass()
win.show()
sys.exit(app.exec_())
设置单元格图片:
#QTableWidget 控件使用
from PyQt5.QtWidgets import QComboBox,QTableView,QAbstractItemView,QHeaderView,QTableWidget, QTableWidgetItem, QMessageBox,QListWidget,QListWidgetItem, QStatusBar, QMenuBar,QMenu,QAction,QLineEdit,QStyle,QFormLayout, QVBoxLayout,QWidget,QApplication ,QHBoxLayout, QPushButton,QMainWindow,QGridLayout,QLabel
from PyQt5.QtGui import QIcon,QPixmap,QStandardItem,QStandardItemModel,QCursor,QFont,QBrush,QColor
from PyQt5.QtCore import QStringListModel,QAbstractListModel,QModelIndex,QSize,Qt
import sys
class WindowClass(QWidget):
def __init__(self,parent=None):
super(WindowClass, self).__init__(parent)
self.layout=QHBoxLayout()
self.resize(400,300)
tableWidget=QTableWidget()
tableWidget.setRowCount(10)#行数
tableWidget.setColumnCount(10)#列数
tableWidget.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)#所有列自动拉伸,充满界面
tableWidget.setSelectionMode(QAbstractItemView.SingleSelection) # 设置只能选中一行
tableWidget.setEditTriggers(QTableView.NoEditTriggers) # 不可编辑
tableWidget.setSelectionBehavior(QAbstractItemView.SelectItems); # 设置只能选中单元格
tableWidget.resizeColumnsToContents()#设置列宽高按照内容自适应
tableWidget.resizeRowsToContents()#设置行宽和高按照内容自适应
#tableWidget.setHorizontalHeaderLabels(['','','','','','','','','',''])
for i in range(10):
tableWidget.setColumnWidth(i,20)
for i in range(10):
tableWidget.setRowHeight(i,20)
for k in range(10):
for m in range(10):
item=QTableWidgetItem()
item.setFlags(Qt.ItemIsEnabled)#点击图片选中单元格
icon=QIcon('./image/7.ico')
item.setIcon(icon)
tableWidget.setItem(k,m,item)
tableWidget.itemClicked.connect(self.getItemsText)
self.layout.addWidget(tableWidget)
self.setLayout(self.layout)
def getItemsText(self,item):
print("获取内容:",item)#item.icon())
if __name__=="__main__":
app=QApplication(sys.argv)
win=WindowClass()
win.show()
sys.exit(app.exec_())