PyQt5 QTableWidget控件删除任意指定行演示
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
class Table_win(QWidget):
def __init__(self,parent=None):
super(Table_win, self).__init__(parent)
self.ini_ui()
def ini_ui(self):
self.setWindowTitle("删除课程Demo")
self.setGeometry(300, 300, 500, 300)
self.main_layout = QVBoxLayout()
self.main_layout.setContentsMargins(0, 0, 0, 0)
self.setLayout(self.main_layout)
self.TableWidget = QTableWidget(5, 3) # 根据out_list自动调整
self.TableWidget.resize(self.width(), self.height())
self.TableWidget.setEditTriggers(QAbstractItemView.NoEditTriggers)
self.TableWidget.verticalHeader().setVisible(False)
self.TableWidget.horizontalHeader().setVisible(True)
self.TableWidget.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
self.TableWidget.horizontalHeader().setStretchLastSection(True)
self.TableWidget.verticalHeader().setSectionResizeMode(QHeaderView.Stretch)
self.TableWidget.setShowGrid(True)
QTableWidget.resizeColumnsToContents(self.TableWidget)
QTableWidget.resizeRowsToContents(self.TableWidget)
self.main_layout.addWidget(self.TableWidget)
self.show()
def show_table(self,title_list,detail_list):
self.TableWidget.setHorizontalHeaderLabels(title_list)
for r in range(len(detail_list)):
course_list = detail_list[r]
course_name = QTableWidgetItem(course_list[0])
course_name.setTextAlignment(Qt.AlignVCenter | Qt.AlignHCenter)
teacher_name = QTableWidgetItem(course_list[1])
teacher_name.setTextAlignment(Qt.AlignVCenter | Qt.AlignHCenter)
self.TableWidget.setItem(r,0,course_name)
self.TableWidget.setItem(r,1,teacher_name)
del_btn = self.del_btn_creater()
self.TableWidget.setCellWidget(r,2,del_btn)
del_btn.clicked.connect(self.del_btn_slot)
def del_btn_creater(self):
del_btn = QPushButton()
del_btn.setText("×")
del_btn.setStyleSheet("""
QPushButton{border:none;
background:transparent;
color:#ff7575;
font-size:30px;
font-weight:700;
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;}
QPushButton:hover{color:red;}""")
return del_btn
def del_btn_slot(self):
del_row = self.TableWidget.currentRow()
course_name = self.TableWidget.item(del_row,0).text()
reply = QMessageBox.critical(self,"警告","你确定删除课程\n{}吗?".format(course_name),QMessageBox.Yes,QMessageBox.No)
if reply == QMessageBox.Yes:
self.TableWidget.removeRow(del_row)
if __name__== "__main__":
import sys
title_list = ["课程","教师","删除"]
detail_list = [["数学","王二"],["语文","张三"],["英文","Jack"],["物理","牛顿"],["化学","阿伏伽德罗"],["生物","达尔文"]]
app = QApplication(sys.argv)
test_win = Table_win()
test_win.show()
test_win.show_table(title_list,detail_list)
sys.exit(app.exec_())
演示效果如动图所示:
- 注:之前做一个项目的时候遇到了QTableWidget删除数据不完全的问题,网上找的解决办法是倒序删除,但是我的项目的需要的是删除指定的行,是没有顺序的,研究了一下,发现只要删除当前的行就能解决问题。TableWidget.removeRow(TableWidget.currentRow())
分享给遇到同样问题的朋友