我正在使用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中分享用于删除所选行/行的示例代码吗?
答案 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 1
和row 2
分别为row 0
和row 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'); ?>