tableWidget
2022/9/14原创大约 2 分钟约 680 字
基础使用
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.tableWidget = QtWidgets.QTableWidget(self.centralwidget)
self.tableWidget.setGeometry(QtCore.QRect(30, 60, 651, 421))
self.tableWidget.setObjectName("tableWidget")
# 指定列数
self.tableWidget.setColumnCount(2)
# 设置列名
titles = ['编号', '姓名', '工资', '入职日期', ' 性别']
self.tableWidget.setHorizontalHeaderLabels(titles)
# 指定列数
self.tableWidget.setRowCount(2)
# 添加列名
self.tableWidget.setHorizontalHeaderLabels(('第一列', '第二列'))
# 插入行
for i in range(10):
self.tableWidget.insertRow(i)
# 添加内容
self.tableWidget.setItem(1, 1, QTableWidgetItem(str(10)))
# 设置表格的高度和宽度
self.tableWidget.resize(self.size().width(),self.size().height())
# 设置列宽的适应方式
self.tableWidget.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
# 隔行换色
self.tableWidget.setAlternatingRowColors(True)
属性
合并单元格
# 合并单元格,当前行、列,合并行数、全并列表
self.tableWidget1.setSpan(0,0,2,1)
隐藏重直表头
self.tableWidget1.verticalHeader().setVisible(False)
隐藏滚动条
self.tableWidget1.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarPolicy.ScrollBarAlwaysOff)
self.tableWidget1.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarPolicy.ScrollBarAlwaysOff)
自适应宽度
self.table = QTableWidget(3, 5) # 3 行 5 列的表格
self.table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch) # 自适应宽度
横向滚动条,列宽可调
self.table.horizontalHeader().setStretchLastSection(True)
列过滤器添加搜索栏
# -*- coding: UTF-8 -*-
from PyQt5 import QtWidgets, QtCore
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QTableWidgetItem, QWidget, QLabel, QGroupBox, QFrame
import pandas as pd
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.tableWidget = QtWidgets.QTableWidget(self.centralwidget)
self.tableWidget.setGeometry(QtCore.QRect(10, 10, 771, 561))
self.tableWidget.setObjectName("tableWidget")
self.tableWidget.setColumnCount(0)
self.tableWidget.setRowCount(0)
MainWindow.setCentralWidget(self.centralwidget)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
class DemoTable(QtWidgets.QMainWindow, Ui_MainWindow):
#signalrunningriskmanagertext = QtCore.pyqtSignal(str)
def __init__(self):
super(DemoTable, self).__init__()
self.setupUi(self)
#Set up table data
self.tableWidget.setRowCount(25)
self.tableWidget.setColumnCount(4)
self.tableWidget.setHorizontalHeaderLabels(['A','B','C','D'])
d = {'A': range(0,25),
'B': range(20,45),
'C': ['a','b','c','d','e','f','g','h','i','d','s','n','s','t','h','d','t','s','t','s','e','y','d','b','s'],
'D': ['a','b','c','d','e','f','g','h','i','d','s','n','s','t','h','d','t','s','t','s','e','y','d','b','s']}
df = pd.DataFrame(data=d)
for row in range(0,25):
for column in range(0,4):
item = QTableWidgetItem(str(df.iloc[row,column]))
self.tableWidget.setItem(row, column, item)
#Add filters in column
self.tableWidgetHeader = self.tableWidget.horizontalHeader()
self.tableWidgetHeader.sectionClicked.connect(self.columnfilterclicked)
self.keywords = dict([(i, []) for i in range(self.tableWidget.columnCount())])
self.checkBoxs = []
self.col = None
def slotSelect(self, state):
for checkbox in self.checkBoxs:
checkbox.setChecked(QtCore.Qt.Checked == state)
def menuClose(self):
self.keywords[self.col] = []
for element in self.checkBoxs:
if element.isChecked():
self.keywords[self.col].append(element.text())
self.filterdata()
self.menu.close()
def clearFilter(self):
if self.tableWidget.rowCount() > 0:
for i in range(self.tableWidget.rowCount()):
self.tableWidget.setRowHidden(i, False)
def filterdata(self):
columnsShow = dict([(i, True) for i in range(self.tableWidget.rowCount())])
for i in range(self.tableWidget.rowCount()):
for j in range(self.tableWidget.columnCount()):
item = self.tableWidget.item(i, j)
if self.keywords[j]:
if item.text() not in self.keywords[j]:
columnsShow[i] = False
for key in columnsShow:
self.tableWidget.setRowHidden(key, not columnsShow[key])
def columnfilterclicked(self,index):
self.menu = QtWidgets.QMenu(self)
self.col = index
data_unique = []
self.checkBoxs = []
checkBox = QtWidgets.QCheckBox("Select all", self.menu)
group=QGroupBox("分组",self.menu)
group.setFixedHeight(100)
label=QtWidgets.QLabel("label",group)
label.setGeometry(10,20,60,20)
checkableAction = QtWidgets.QWidgetAction(self.menu)
checkableAction.setDefaultWidget(checkBox)
self.menu.addAction(checkableAction)
checkableAction1 = QtWidgets.QWidgetAction(self.menu)
checkableAction1.setDefaultWidget(group)
self.menu.addAction(checkableAction1)
checkBox.setChecked(True)
checkBox.stateChanged.connect(self.slotSelect)
for i in range(self.tableWidget.rowCount()):
if not self.tableWidget.isRowHidden(i):
item = self.tableWidget.item(i, index)
if item.text() not in data_unique:
data_unique.append(item.text())
checkBox = QtWidgets.QCheckBox(item.text(), self.menu)
checkBox.setChecked(True)
checkableAction = QtWidgets.QWidgetAction(self.menu)
checkableAction.setDefaultWidget(checkBox)
self.menu.addAction(checkableAction)
self.checkBoxs.append(checkBox)
btn = QtWidgets.QDialogButtonBox(QtWidgets.QDialogButtonBox.Ok | QtWidgets.QDialogButtonBox.Cancel,
QtCore.Qt.Horizontal, self.menu)
btn.accepted.connect(self.menuClose)
btn.rejected.connect(self.menu.close)
checkableAction = QtWidgets.QWidgetAction(self.menu)
checkableAction.setDefaultWidget(btn)
self.menu.addAction(checkableAction)
#
headerPos = self.tableWidget.mapToGlobal(self.tableWidgetHeader.pos())
#
posY = headerPos.y() + self.tableWidgetHeader.height()
posX = headerPos.x() + self.tableWidgetHeader.sectionPosition(index)
self.menu.exec_(QtCore.QPoint(posX, posY))
# self.widget=QFrame(self)
# self.widget.setStyleSheet("background-color:red")
# self.label=QLabel(self.tableWidget)
# self.label.setText('lael')
# self.widget.setWindowFlags(Qt.FramelessWindowHint)
# self.widget.setGeometry(posX,posY,100,100)
# self.widget.show()
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
window = DemoTable()
window.show()
sys.exit(app.exec_())