PyQt5 Qtablewidget y conexión a botones

He creado un Qtablewidget como clase, y add_button para agregar filas, un delete_button para eliminar filas de la tabla hacia arriba. Me gustaría conectar funciones a los botones, pero no funciona correctamente. He utilizado el método getattr para llamar a la función, todavía no funciona.

La mesa

introduzca la descripción de la imagen aquí

Para explicar más, esas líneas de guión están dando errores de atribución. cuando son llamados por el método button.clicked.connect.

add_button.clicked.connect(self._addrow) delete_button.clicked.connect(self._removeItem) 

El guión es el siguiente:

 import sys from PyQt5 import QtCore, QtGui, QtWidgets, Qt class loadtable(QtWidgets.QTableWidget): def __init__(self, parent=None): super(loadtable, self).__init__(parent) self.setColumnCount(5) self.setRowCount(1) self.setFont(QtGui.QFont("Helvetica", 10, QtGui.QFont.Normal, italic=False)) headertitle = ("A","B","C","D","E") self.setHorizontalHeaderLabels(headertitle) self.verticalHeader().setVisible(False) self.horizontalHeader().setHighlightSections(False) self.horizontalHeader().setSectionResizeMode(QtWidgets.QHeaderView.Fixed) self.setSelectionMode(QtWidgets.QAbstractItemView.NoSelection) self.setColumnWidth(0, 130) combox_lay = QtWidgets.QComboBox(self) combox_lay.addItems(["I","II"]) self.setCellWidget(0, 4, combox_lay) self.cellChanged.connect(self._cellclicked) #self.cellChanged.connect(self._addrow) #self.cellDoubleClicked.connect(self._removerow) def _cellclicked(self): self.value = self.currentItem() self.value.setTextAlignment(Qt.AlignCenter) #if self.value is not None: #return self.value.setTextAlignment(Qt.AlignCenter) def _addrow(self): rowcount = self.rowCount() print(rowcount) self.setRowCount(rowcount+1) combox_add = QtWidgets.QComboBox(self) combox_add.addItems(["I","II"]) self.setCellWidget(rowcount, 4, combox_add) def _removerow(self): self.removeRow(1) class thirdtabloads(QtWidgets.QWidget): def __init__(self, parent=None): super(thirdtabloads, self).__init__(parent) table = loadtable() button_layout = QtWidgets.QVBoxLayout() add_button = QtWidgets.QPushButton("Add") add_button.clicked.connect(self._addrow) delete_button = QtWidgets.QPushButton("Delete") delete_button.clicked.connect(self._removeItem) button_layout.addWidget(add_button, alignment=QtCore.Qt.AlignBottom) button_layout.addWidget(delete_button, alignment=QtCore.Qt.AlignTop) tablehbox = QtWidgets.QHBoxLayout() tablehbox.setContentsMargins(10,10,10,10) tablehbox.addWidget(table) grid = QtWidgets.QGridLayout(self) grid.addLayout(button_layout, 0, 1) grid.addLayout(tablehbox, 0, 0) if __name__ == '__main__': app = QtWidgets.QApplication(sys.argv) w = thirdtabloads() w.show() sys.exit(app.exec_()) 

Para agregar una fila, debe usar insertRow() , para eliminar la última fila use removeRow() y pase la última fila y recuerde que la numeración comienza desde 0, por lo que la última fila es self.rowCount() - 1.

Por otro lado, su conexión es incorrecta, le pregunto: ¿Quién es el propietario de la ranura _addrow() y _removerow() ? pertenece a LoadTable, por lo que para acceder a ellos necesitamos un objeto de esa clase, es decir, table._addrow y table._removerow .

 import sys from PyQt5 import QtCore, QtGui, QtWidgets class LoadTable(QtWidgets.QTableWidget): def __init__(self, parent=None): super(LoadTable, self).__init__(1, 5, parent) self.setFont(QtGui.QFont("Helvetica", 10, QtGui.QFont.Normal, italic=False)) headertitle = ("A","B","C","D","E") self.setHorizontalHeaderLabels(headertitle) self.verticalHeader().hide() self.horizontalHeader().setHighlightSections(False) self.horizontalHeader().setSectionResizeMode(QtWidgets.QHeaderView.Fixed) self.setSelectionMode(QtWidgets.QAbstractItemView.NoSelection) self.setColumnWidth(0, 130) combox_lay = QtWidgets.QComboBox(self) combox_lay.addItems(["I","II"]) self.setCellWidget(0, 4, combox_lay) self.cellChanged.connect(self._cellclicked) @QtCore.pyqtSlot(int, int) def _cellclicked(self, r, c): it = self.item(r, c) it.setTextAlignment(QtCore.Qt.AlignCenter) @QtCore.pyqtSlot() def _addrow(self): rowcount = self.rowCount() self.insertRow(rowcount) combox_add = QtWidgets.QComboBox(self) combox_add.addItems(["I","II"]) self.setCellWidget(rowcount, 4, combox_add) @QtCore.pyqtSlot() def _removerow(self): if self.rowCount() > 0: self.removeRow(self.rowCount()-1) class ThirdTabLoads(QtWidgets.QWidget): def __init__(self, parent=None): super(ThirdTabLoads, self).__init__(parent) table = LoadTable() add_button = QtWidgets.QPushButton("Add") add_button.clicked.connect(table._addrow) delete_button = QtWidgets.QPushButton("Delete") delete_button.clicked.connect(table._removerow) button_layout = QtWidgets.QVBoxLayout() button_layout.addWidget(add_button, alignment=QtCore.Qt.AlignBottom) button_layout.addWidget(delete_button, alignment=QtCore.Qt.AlignTop) tablehbox = QtWidgets.QHBoxLayout() tablehbox.setContentsMargins(10, 10, 10, 10) tablehbox.addWidget(table) grid = QtWidgets.QGridLayout(self) grid.addLayout(button_layout, 0, 1) grid.addLayout(tablehbox, 0, 0) if __name__ == '__main__': app = QtWidgets.QApplication(sys.argv) w = ThirdTabLoads() w.show() sys.exit(app.exec_())