PyQt5 QTableWidget
QTableWidget 示例1
演示QTableWidget控件的基本使用方法
import sys
from PyQt5.QtWidgets import (QWidget, QTableWidget, QTableWidgetItem, QHBoxLayout, QApplication, QAbstractItemView, QHeaderView)
from PyQt5.QtCore import Qt
class Table(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setWindowTitle("QTableWidget Demo")
self.resize(400, 300)
conLayout = QHBoxLayout()
tableWidget = QTableWidget()
tableWidget.setRowCount(4)
tableWidget.setColumnCount(3)
conLayout.addWidget(tableWidget)
# 设置行标题
tableWidget.setHorizontalHeaderLabels(['姓名','性别','体重(kg)'])
# 设置列标题
tableWidget.setVerticalHeaderLabels(['行1','行2','行3','行4'])
# 设置水平方向自适应伸缩模式
tableWidget.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
# 将行和列的宽度,高度设置为与所显示的内容的宽度,高度相匹配
tableWidget.resizeColumnsToContents()
tableWidget.resizeRowsToContents()
# 隐藏表格的表头
# tableWidget.horizontalHeader().setVisible(False)
# tableWidget.verticalHeader().setVisible(False)
# 设置编辑规则
tableWidget.setEditTriggers(QAbstractItemView.NoEditTriggers)
# QAbstractItemView.NoEditTriggers
# QAbstractItemView.CurrentChanged
# QAbstractItemView.DoubleClicked
# QAbstractItemView.SelectedClicked
# QAbstractItemView.EditKeyPressed
# QAbstractItemView.AnyKeyPressed
# QAbstractItemView.AllEditTriggers
# 设置选择行为
tableWidget.setSelectionBehavior(QAbstractItemView.SelectItems)
# QAbstractItemView.SelectItems
# QAbstractItemView.SelectRows
# QAbstractItemView.SelectColumns
# Qt.AlignLeft
# Qt.AlignRight
# Qt.AlignHCenter
# Qt.AlignJustify
# Qt.AlignTop
# Qt.AlignBottom
# Qt.AlignVCenter
# Qt.AlignBaseline
newItem = QTableWidgetItem("张三")
tableWidget.setItem(0, 0, newItem)
newItem.setTextAlignment(Qt.AlignLeft)
newItem = QTableWidgetItem("男")
tableWidget.setItem(0, 1, newItem)
newItem = QTableWidgetItem("160")
tableWidget.setItem(0, 2, newItem)
self.setLayout(conLayout)
if __name__ == "__main__":
app = QApplication(sys.argv)
win = Table()
win.show()
sys.exit(app.exec_())
QTableWidget 示例2
添加控件类型条目
import sys
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import Qt
class MyTableWidget(QWidget):
def __init__(self, parent=None):
super(MyTableWidget, self).__init__(parent)
self.initUI()
def initUI(self):
self.setWindowTitle("QTableWidget Demo 2")
self.resize(300, 200)
layout = QHBoxLayout()
tableWidget = QTableWidget()
tableWidget.setRowCount(4)
tableWidget.setColumnCount(3)
tableWidget.setHorizontalHeaderLabels(['一','二','三'])
newItem = QTableWidgetItem("Java")
tableWidget.setItem(0,0, newItem)
comBox = QComboBox()
comBox.addItem("男")
comBox.addItem("女")
comBox.setStyleSheet("QComboBox{margin:3px};")
tableWidget.setCellWidget(0,1, comBox)
modifyBtn = QPushButton("修改")
modifyBtn.setStyleSheet("QPushButton{margin:3px};")
tableWidget.setCellWidget(0, 2, modifyBtn)
# item = tableWidget.findItems("Java", Qt.MatchExactly)
# row = item[0].row()
# tableWidget.verticalScrollBar().setSliderPosition(2)
layout.addWidget(tableWidget)
self.setLayout(layout)
if __name__ == "__main__":
app = QApplication(sys.argv)
win = MyTableWidget()
win.show()
sys.exit(app.exec_())
QTableWidget 示例3
模拟通过鼠标滚轮快速定位到指定项
import sys
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import Qt
class Table(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setWindowTitle("QTableWidget Demo 3")
self.resize(600, 800)
conLayout = QHBoxLayout()
tableWidget = QTableWidget()
tableWidget.setRowCount(30)
tableWidget.setColumnCount(4)
conLayout.addWidget(tableWidget)
for i in range(30):
for j in range(4):
itemContent = '(%d,%d)' % (i, j)
tableWidget.setItem(i, j, QTableWidgetItem(itemContent))
self.setLayout(conLayout)
# 遍历表格查找对应项
text = "(10,1)"
items = tableWidget.findItems(text, Qt.MatchExactly)
item = items[0]
# 选中单元格
#item.setSelected(True)
# 设置字体为红色
item.setForeground(QBrush(QColor(255, 0, 0)))
row = item.row()
# 模拟通过鼠标滚轮快速定位到指定项
tableWidget.verticalScrollBar().setSliderPosition(row)
if __name__ == "__main__":
app = QApplication(sys.argv)
win = Table()
win.show()
sys.exit(app.exec_())
QTableWidget 示例4
设置字体颜色,背景颜色,设置内容字体,排序,隐藏表格头等。
import sys
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import Qt
class Table(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("QWidget Demo 3")
layout = QHBoxLayout()
tableWidget = QTableWidget()
tableWidget.setRowCount(10)
tableWidget.setColumnCount(3)
tableWidget.setRowHeight(0, 100)
tableWidget.setColumnWidth(0, 50)
tableWidget.setShowGrid(False)
tableWidget.verticalHeader().setVisible(False)
# 设置 前景,背景颜色
newItem = QTableWidgetItem("张三")
newItem.setForeground(QBrush(QColor(255, 0, 0)))
newItem.setBackground(QBrush(QColor(0, 255, 0)))
tableWidget.setItem(0, 0, newItem)
# 设置字体
newItem = QTableWidgetItem("男")
newItem.setFont(QFont("Times", 16, QFont.Black))
tableWidget.setItem(0, 1, newItem)
newItem = QTableWidgetItem("160")
newItem.setFont(QFont("times", 12, QFont.Bold))
tableWidget.setItem(0, 2, newItem)
# Qt.DescendingOrder 降序
# Qt.AscendingOrder 升序
newItem = QTableWidgetItem("李四")
tableWidget.setItem(1,0, newItem)
newItem = QTableWidgetItem("男")
tableWidget.setItem(1, 1, newItem)
newItem = QTableWidgetItem("172")
tableWidget.setItem(1, 2, newItem)
newItem = QTableWidgetItem("小红")
tableWidget.setItem(2, 0, newItem)
newItem = QTableWidgetItem("女")
tableWidget.setItem(2, 1, newItem)
newItem = QTableWidgetItem("150")
tableWidget.setItem(2, 2, newItem)
# 第3列 按升序排序
tableWidget.sortItems(2, Qt.DescendingOrder)
layout.addWidget(tableWidget)
self.setLayout(layout)
if __name__ == "__main__":
app = QApplication(sys.argv)
win = Table()
win.show()
sys.exit(app.exec_())
QTableWidget 示例5
表格显示图标
import sys
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import Qt
# 新手
class Table(QWidget):
def __init__(self, parent=None):
super(Table, self).__init__(parent)
self.setWindowTitle("QWidget 显示图片")
self.initUI()
def initUI(self):
layout = QHBoxLayout()
tableWidget = QTableWidget()
tableWidget.setColumnCount(3)
tableWidget.setRowCount(5)
tableWidget.setHorizontalHeaderLabels(['图片1', '图片2', '图片3'])
tableWidget.setEditTriggers(QAbstractItemView.NoEditTriggers)
tableWidget.setIconSize(QSize(300, 200))
for i in range(3): # 让列宽和图片相同
tableWidget.setColumnWidth(i, 300)
for i in range(5):
tableWidget.setRowHeight(i, 200)
for k in range(15):
i = k/3
j = k%3
item = QTableWidgetItem()
item.setFlags(Qt.ItemIsEnabled) # 用户点击表格时,图片被选中
icon = QIcon(r'D:\project\python\pyqt5\advance_high\images\bao%d.png' % k)
# icon = QIcon(r'D:\project\python\pyqt5\advance_high\images\bao0.png')
item.setIcon(QIcon(icon))
tableWidget.setItem(i, j, item)
tableWidget.itemClicked.connect(self.handleItemClick)
layout.addWidget(tableWidget)
self.setLayout(layout)
def handleItemClick(self, item):
print('you selected => ', item.row(), item.column())
if __name__ == "__main__":
app = QApplication(sys.argv)
win = Table()
win.show()
sys.exit(app.exec_())
QTableWidget 示例6
支持右键弹窗菜单
import sys
from PyQt5.QtWidgets import (QMenu, QPushButton, QWidget, QTableWidget, QTableWidgetItem,
QHBoxLayout, QApplication, QDesktopWidget, QHeaderView)
from PyQt5.QtCore import pyqtSignal, QObject, pyqtSlot
from PyQt5.QtCore import Qt
# 支持右键弹窗菜单
class Table(QWidget):
def __init__(self, parent=None):
super().__init__()
self.initUI()
def initUI(self):
self.setWindowTitle("QTableWidget Demo 6")
self.resize(500, 300)
conLayout = QHBoxLayout()
self.tableWidget = QTableWidget()
self.tableWidget.setRowCount(5)
self.tableWidget.setColumnCount(3)
conLayout.addWidget(self.tableWidget)
self.tableWidget.setHorizontalHeaderLabels(['姓名', '性别', '体重'])
self.tableWidget.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
newItem = QTableWidgetItem("张三")
self.tableWidget.setItem(0, 0, newItem)
newItem = QTableWidgetItem("男")
self.tableWidget.setItem(0, 1, newItem)
newItem = QTableWidgetItem("160")
self.tableWidget.setItem(0, 2, newItem)
newItem = QTableWidgetItem("李四")
self.tableWidget.setItem(1, 0, newItem)
newItem = QTableWidgetItem("女")
self.tableWidget.setItem(1, 1, newItem)
newItem = QTableWidgetItem("170")
self.tableWidget.setItem(1, 2, newItem)
# 允许右键产生菜单
self.tableWidget.setContextMenuPolicy(Qt.CustomContextMenu)
#将右键菜单绑定到槽函数generateMenu
self.tableWidget.customContextMenuRequested.connect(self.generateMenu)
self.setLayout(conLayout)
def generateMenu(self, pos):
row_num = -1
for i in self.tableWidget.selectionModel().selection().indexes():
row_num = i.row()
# 表格中只有两条有效数据,所以只在前两行支持右键弹出菜单
if row_num < 2:
menu = QMenu()
item1 = menu.addAction(u"选项一")
item2 = menu.addAction(u"选项二")
item3 = menu.addAction(u"选项三")
action = menu.exec(self.tableWidget.mapToGlobal(pos))
if action == item1:
print('第一项', self.tableWidget.item(row_num, 0).text(), self.tableWidget.item(row_num, 1).text(), self.tableWidget.item(row_num, 2).text())
elif action == item2:
print("第二项", self.tableWidget.item(row_num, 0).text(), self.tableWidget.item(row_num, 1).text(), self.tableWidget.item(row_num, 2).text())
elif action == item3:
print("第三项", self.tableWidget.item(row_num, 0).text(), self.tableWidget.item(row_num, 1).text(), self.tableWidget.item(row_num, 2).text())
else:
return
if __name__ == "__main__":
app = QApplication(sys.argv)
win = Table()
win.show()
sys.exit(app.exec_())