Как удалить всю строку в pyqt4 (виджет qtable)

Здесь, когда я пытаюсь удалить выбранную строку, я получаю следующую ошибку:

Msgstr "TypeError: аргумент 1 в QAbstractItemModel.removeRow() имеет недопустимый тип".

Я много искал правильный способ удаления выбранных строк / строк в qtablewidget из pyqt. Однако я не могу удалить выбранную строку / строки.

Можете ли вы поделиться примером кода для удаления выбранной строки / строк в qtablewidget из pyqt?

import sys
from functools import partial
from PyQt4 import QtGui, QtCore


class Example(QtGui.QWidget):
    def __init__(self):
        super(Example, self).__init__()
        self.initUI()

    def initUI(self):
        self. table = QtGui.QTableWidget(self)
        self.table.setGeometry(10,70, 600,300)
        self.table.setRowCount(3)
        self.table.setColumnCount(6)

        self.table.verticalHeader().hide()
        self.table.setEditTriggers(QtGui.QAbstractItemView.NoEditTriggers)

        fnt = self.table.font()
        fnt.setPointSize(11)
        self.table.setFont(fnt)

        self.table.setHorizontalHeaderLabels(("S.no, Item,Qty,Rate(Rs:),total,"",").split(','))

        all_data = [("1", "xxx", 10, 0),
                    ("2", "yyy", 20, 0),
                    ("3", "zzz", 30, 0)]

        for r, row_data in enumerate(all_data):
            for c, value in zip((0, 1, 3), row_data):
                it = QtGui.QTableWidgetItem(str(value))
                self.table.setItem(r, c, it)

        for r in range(self.table.rowCount()):

            spin = QtGui.QSpinBox(minimum=0, maximum=50)
            spin.valueChanged.connect(partial(self.calculateSubTotal, r))
            self.table.setCellWidget(r, 2, spin)

            btn = QtGui.QPushButton(icon=QtGui.QIcon("trash1.png"))
            self.table.setCellWidget(r, 5, btn)
            # selected = self.table.selectedItems()
            # btn.clicked.connect(self.remove)

        self.setWindowTitle("table")
        self.setGeometry(200, 300, 400, 300)
        self.show()
    # def remove(self,row):
        # self.table.removeRow(self.table.currentRow)    

    def calculateSubTotal(self, row, value):
        rate = float(self.table.item(row, 3).text())
        subtotal = value * rate

        item_subtotal = self.table.item(row, 4)
        if item_subtotal is None:
            item_subtotal = QtGui.QTableWidgetItem()
            self.table.setItem(row, 4, item_subtotal)

        item_subtotal.setText(str(subtotal))

def main():
    app = QtGui.QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_()) 


if __name__ == '__main__':
    main()

2 ответа

Ваш синтаксис был почти правильный, попробуйте добавить скобки:

self.table.removeRow(self.table.currentRow())

Когда вы нажимаете кнопку QTableWidget не уведомляется, так как события виджетов не уведомляются QTableWidget так currentRow не будет служить вам. вместо этого вы должны использовать переменную r для цикла, и для этого мы используем functools.partial(...)

for r in range(self.table.rowCount()):
    ...

    btn = QtGui.QPushButton(icon=QtGui.QIcon("trash1.png"))
    self.table.setCellWidget(r, 5, btn)
    btn.clicked.connect(partial(self.table.removeRow, r)) # <---
Другие вопросы по тегам