如何从pyqt中的qtableview中删除行/行?

时间:2016-06-13 09:35:11

标签: python qt pyqt pyqt4 qtableview

我正在使用QStandardItemModel作为我的qtableview。

import ui_my_viewlogs
import os
from PyQt4 import QtCore, QtGui

class my_viewlogs(QtGui.QDialog, ui_my_viewlogs.Ui_viewlogs):
    def __init__(self):
        super(my_viewlogs, self).__init__()
        self.setupUi(self)
        self.model = QtGui.QStandardItemModel()
        self.tableView.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
        self.header_names = ['abc', 'def', 'ghi', 'kjl', 'mno', 'pqr']
        self.model.setHorizontalHeaderLabels(self.header_names)
        self.tableView.verticalHeader().setVisible(False)
        self.tableView.setShowGrid(False)
        self.selectionModel = self.tableView.selectionModel()
        self.tableView.customContextMenuRequested.connect(self.open_menu)
        self.tableView.setModel(self.model)
        self.tableView.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows)

    def open_menu(self, position):
        menu = QtGui.QMenu()
        remove_selected_item_icon = QtGui.QIcon()
        remove_selected_item_icon.addPixmap(QtGui.QPixmap(":/images      /Images/deleteSelected.png"), QtGui.QIcon.Normal, QtGui.QIcon.On)
        remove_selected_item = menu.addAction(remove_selected_item_icon, "Remove selected item(s) ")
        if action == remove_selected_item:           
            model = self.model
            indices = self.tableView.selectionModel().selectedRows() 
            for index in sorted(indices):
                model.removeRow(index.row(), QtCore.QModelIndex()) 

这里当我试图删除所选的行(即model.removeRow())时出现错误“TypeError:QAbstractItemModel.removeRow()的参数1具有无效的类型”。

我已经搜索了在pyqt的qtableview中删除所选行/行的正确方法。但是,我无法删除选定的行/行。

请您在pyqt的qtableview中分享用于删除所选行/行的示例代码吗?

5 个答案:

答案 0 :(得分:14)

方法model.removeRow(index.row())删除所选行。

'%.02f' % number
#=> "29.90"

在indices变量中我们得到所选行,然后我们删除该行。

在我们选择的tableview中删除多行:

model = self.model
    indices = self.tableView.selectionModel().selectedRows() 
    for index in sorted(indices):
        model.removeRow(index.row()) 

答案 1 :(得分:2)

在 C++ 中:

QModelIndexList indices = myTable->selectionModel()->selectedRows();

for (int i=indices.count()-1; i>=0; --i)
{
    QModelIndex index = indices.at(i);
    myTable->removeRow(index.row());
}

你必须从列表的底部到顶部,否则你的索引会被搞砸。

答案 2 :(得分:0)

如果在实施Anuj Bhasin's答案后仍在寻找答案,因为上述解决方案在许多情况下都无法正常工作。

原因:

  • 当您删除行索引(例如[0,1,2])并开始从0 -> 1 -> 2删除时,只有第0行和第2行将被删除!
  • 删除第一项将使剩余的行上移,使row 1row 2分别为row 0row 1,因此当您下一个删除行1,第2行(以前)将被删除,因为现在是第1行。

我对此有一个解决方案:

通过您要删除的行,例如从5行中删除[0,3]

def setSel(selected: List[int], table_widget: QTableWidget):
    """
    Select all rows for the given index range
    """
    table_widget.setSelectionMode(QAbstractItemView.MultiSelection)
    for i in selected:
        table_widget.selectRow(i)

然后使用table_widget:remove_row_all_table()作为参数调用QTableWidget

def remove_row_all_table(table_widget):
    """
    Select and Delete rows from table widget
    """
    table_widget: QTableWidget
    selected_rows = table_widget.selectionModel().selectedRows()
    if selected_rows:
        row_indices = []
        for row_index in selected_rows:
            row_indices.append(row_index.row())
        row_indices.sort(key=lambda x: -1 * x)
        print(row_indices)
        for row in row_indices:  # sorted in descending order
            print(f"row count:{table_widget.rowCount()}, deleting index:{row}")
            table_widget.removeRow(row)
    print()

此答案的摘要是:您必须打开MultiSelection模式并以相反的顺序删除,即从较高的索引到较低的索引,这样才不会出现我在答案开头提到的依赖性。

答案 3 :(得分:0)

我知道这是一个较旧的问题,但我认为这个问题更简洁并且有效。

def delete_record1(self, model, view):
    """Delete rows with currently selected cells and/or selected rows of the model"""
    rows = [model_index.row() for model_index in view.selectedIndexes()]
    
    rows.sort(reverse=True)

    for i in rows:
        model.removeRow(i)
    
    model.submitAll()
    model.select()    

谁能告诉我这种方法的缺陷是什么?

答案 4 :(得分:0)

这对我来说使用 reversed() 很好用。

<?php the_field('sample_option_field', 'option'); ?>