如何从 pyqt 的 qtableview 中删除 row/rows?
How to delete row/rows from a qtableview in pyqt?
我正在为我的 qtableview 使用 QStandardItemModel。
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() )时,出现错误“类型错误:QAbstractItemModel.removeRow() 的参数 1 具有无效类型”。
我搜索了很多在pyqt的qtableview中删除选定row/rows的正确方法。但是,我无法删除选定的 row/rows.
能否分享一个在pyqt的qtableview中删除选中的row/rows的示例代码?
方法 model.removeRow(index.row()) 删除所选行。
model = self.model
indices = self.tableView.selectionModel().selectedRows()
for index in sorted(indices):
model.removeRow(index.row())
在 indices 变量中,我们获取选定的行,然后删除该行。
在我们选择的表视图中删除多行:
index_list = []
for model_index in self.tableView.selectionModel().selectedRows():
index = QtCore.QPersistentModelIndex(model_index)
index_list.append(index)
for index in index_list:
self.model.removeRow(index.row())
如果有人在实施 Anuj Bhasin's
答案后仍在寻找答案,因为上述解决方案在许多情况下都无法按预期工作。
原因:
- 当您删除行索引时(例如
[0,1,2]
),并且您从0 -> 1 -> 2
开始删除,那么只会删除第0行和第2行!
- 删除第一项会将剩余的行向上移动,使
row 1
和 row 2
成为 row 0
和 row 1
因此,当您下次删除第 1 行时,第 2 行(之前)将被删除,因为它现在是第 1 行。
我有解决办法:
传递要删除的行,例如 from 5 rows delete [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:QTableWidget
作为参数调用 remove_row_all_table()
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模式并以相反的顺序删除,即从高索引到低索引,这样我在答案开头提到的依赖关系不会发生。
我知道这是一个有点老的问题,但我认为这更简洁并且可以解决问题。
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()
谁能告诉我这种方法的缺陷是什么?
在 C++ 中:
QModelIndexList indices = myTable->selectionModel()->selectedRows();
for (int i=indices.count()-1; i>=0; --i)
{
QModelIndex index = indices.at(i);
myTable->removeRow(index.row());
}
您必须从列表底部转到顶部,否则您的索引将被搞砸。
使用 reversed() 对我来说效果很好。
indices = self.tag_table.selectionModel().selectedRows()
# Must delete in reverse order
for each_row in reversed(sorted(indices)):
self.tag_table.removeRow(each_row.row())
我正在为我的 qtableview 使用 QStandardItemModel。
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() )时,出现错误“类型错误:QAbstractItemModel.removeRow() 的参数 1 具有无效类型”。
我搜索了很多在pyqt的qtableview中删除选定row/rows的正确方法。但是,我无法删除选定的 row/rows.
能否分享一个在pyqt的qtableview中删除选中的row/rows的示例代码?
方法 model.removeRow(index.row()) 删除所选行。
model = self.model
indices = self.tableView.selectionModel().selectedRows()
for index in sorted(indices):
model.removeRow(index.row())
在 indices 变量中,我们获取选定的行,然后删除该行。
在我们选择的表视图中删除多行:
index_list = []
for model_index in self.tableView.selectionModel().selectedRows():
index = QtCore.QPersistentModelIndex(model_index)
index_list.append(index)
for index in index_list:
self.model.removeRow(index.row())
如果有人在实施 Anuj Bhasin's
答案后仍在寻找答案,因为上述解决方案在许多情况下都无法按预期工作。
原因:
- 当您删除行索引时(例如
[0,1,2]
),并且您从0 -> 1 -> 2
开始删除,那么只会删除第0行和第2行! - 删除第一项会将剩余的行向上移动,使
row 1
和row 2
成为row 0
和row 1
因此,当您下次删除第 1 行时,第 2 行(之前)将被删除,因为它现在是第 1 行。
我有解决办法:
传递要删除的行,例如 from 5 rows delete [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:QTableWidget
作为参数调用 remove_row_all_table()
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模式并以相反的顺序删除,即从高索引到低索引,这样我在答案开头提到的依赖关系不会发生。
我知道这是一个有点老的问题,但我认为这更简洁并且可以解决问题。
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()
谁能告诉我这种方法的缺陷是什么?
在 C++ 中:
QModelIndexList indices = myTable->selectionModel()->selectedRows();
for (int i=indices.count()-1; i>=0; --i)
{
QModelIndex index = indices.at(i);
myTable->removeRow(index.row());
}
您必须从列表底部转到顶部,否则您的索引将被搞砸。
使用 reversed() 对我来说效果很好。
indices = self.tag_table.selectionModel().selectedRows()
# Must delete in reverse order
for each_row in reversed(sorted(indices)):
self.tag_table.removeRow(each_row.row())