话不多说,先上正确的代码:
from PyQt5 import QtCore, QtGui, QtWidgets
import sys
class NewTableWidget(QtWidgets.QWidget):
def __init__(self,lst):
super().__init__()
self.resize(800,300)
self.hlayout = QtWidgets.QHBoxLayout(self)
self.lst = lst
self.newTableWidget()
# 表格控件
def newTableWidget(self):
label7 = QtWidgets.QLabel('已添加:')
self.tableWidget = QtWidgets.QTableWidget()
self.tableWidget.setRowCount(3)
self.tableWidget.setColumnCount(len(self.lst))
self.tableWidget.setHorizontalHeaderLabels(self.lst)
self.tableWidget.horizontalHeader().setSectionResizeMode(QtWidgets.QHeaderView.Stretch) # 使列表自适应宽度
self.tableWidget.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers) # 设置tablewidget不可编辑
self.tableWidget.setSelectionMode(QtWidgets.QAbstractItemView.NoSelection) # 设置tablewidget不可选中
for i in range(3):
self.tableWidget.setCellWidget(i, len(self.lst) - 1, self.buttonForRow()) # 在最后一个单元格中加入修改、删除按钮
self.hlayout.addWidget(label7)
self.hlayout.addWidget(self.tableWidget)
def buttonForRow(self):
widget = QtWidgets.QWidget()
# 修改
self.updateBtn = QtWidgets.QPushButton('修改')
self.updateBtn.setStyleSheet(''' text-align : center;
background-color : NavajoWhite;
height : 30px;
border-style: outset;
font : 13px ''')
# 删除
self.deleteBtn = QtWidgets.QPushButton('删除')
self.deleteBtn.setStyleSheet(''' text-align : center;
background-color : LightCoral;
height : 30px;
border-style: outset;
font : 13px; ''')
self.deleteBtn.clicked.connect(self.DeleteButton)
hLayout = QtWidgets.QHBoxLayout()
hLayout.addWidget(self.updateBtn)
hLayout.addWidget(self.deleteBtn)
hLayout.setContentsMargins(5, 2, 5, 2)
widget.setLayout(hLayout)
return widget
def DeleteButton(self):
button = self.sender()
if button:
# 确定位置的时候这里是关键
row = self.tableWidget.indexAt(button.parent().pos()).row()
#self.tableWidget.removeRow(row)
print(row)
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
lst = ['年份', '上报情况', '上报时间', '附件上传', '操作']
win = NewTableWidget(lst)
app.setWindowIcon(QtGui.QIcon('img/system.png'))
win.show()
sys.exit(app.exec_())
运行结果:
分析:
确定位置的关键语句主要是row = self.tableWidget.indexAt(button.parent().pos()).row() -------①,网上好多语句都是row = self.tableWidget.indexAt(button.pos()).row() --------- ②,先说一下这个语句,这个语句是在qtablewidget中添加单个按钮的时候来确定其位置,点击button释放信号可以被接收到。但是当我们要添加两个甚至多个按钮时,我相信很多人都是将其合并到一个widget,然后使用qtablewidget的setCellwidget将多个按钮加入到单元格中。此时如果在使用语句②定位的话,定位到按钮的位置是按钮在父控件(widget)中的位置,这样,按钮的行列值就永远都是一样的,0或者其他值。如果使用语句①来确定其父控件的位置,这样就能得到正确的行列值,可以对相应的行和列进行修改