代码之家  ›  专栏  ›  技术社区  ›  cynric4sure

pyqt5按钮如何删除它所在的qtablewidget中的行

  •  1
  • cynric4sure  · 技术社区  · 6 年前

    所以基本上我在qtablewidget中的每一行都有一个删除按钮 单击事件。

    如何找到被单击的特定按钮的行索引?

    class WidgetGallery(QDialog):
        def __init__(self, parent=None):
            super(WidgetGallery, self).__init__(parent)
            self.table = QTableWidget(10, 3)
            col_1 = QTableWidgetItem("first_col")
            col_2 = QTableWidgetItem("second_col")
            deleteButton = QPushButton("delete_this_row")
            deleteButton.clicked.connect(self.deleteClicked)
            self.table.setItem(0, 0, col_1)
            self.table.setItem(0, 1, col_2)
            self.table.setCellWidget(0, 2, deleteButton)
            self.mainLayout = QGridLayout()
            self.mainLayout.addWidget(self.table)
    
    
        def deleteClicked(self):
            sender = self.sender()
            row = sender.parent().........?
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   eyllanesc Yonghwan Shin    6 年前

    根据您的评论,您正在使用 my previous answer 作为基础,但正如您指出的,这些都失败了,因为前一个问题的上下文不同于您当前的代码,在前一种情况下,有一个父窗口小部件,其中设置了按钮,而该窗口小部件只是在qtablewidget中设置的。在这种情况下,必须直接:

    from PyQt5 import QtCore, QtGui, QtWidgets
    
    class WidgetGallery(QtWidgets.QDialog):
        def __init__(self, parent=None):
            super(WidgetGallery, self).__init__(parent)
            self.table = QtWidgets.QTableWidget(10, 3)
            col_1 = QtWidgets.QTableWidgetItem("first_col")
            col_2 =QtWidgets.QTableWidgetItem("second_col")
            deleteButton = QtWidgets.QPushButton("delete_this_row")
            deleteButton.clicked.connect(self.deleteClicked)
            self.table.setItem(0, 0, col_1)
            self.table.setItem(0, 1, col_2)
            self.table.setCellWidget(0, 2, deleteButton)
            self.mainLayout = QtWidgets.QGridLayout(self)
            self.mainLayout.addWidget(self.table)
    
        @QtCore.pyqtSlot()
        def deleteClicked(self):
            button = self.sender()
            if button:
                row = self.table.indexAt(button.pos()).row()
                self.table.removeRow(row)
    
    if __name__ == '__main__':
        import sys
        app = QtWidgets.QApplication(sys.argv)
        w = WidgetGallery()
        w.show()
        sys.exit(app.exec_())