gpt4 book ai didi

python - pyqt QStandardItemModel 有没有办法从模型中完全删除值?

转载 作者:行者123 更新时间:2023-12-01 01:06:52 24 4
gpt4 key购买 nike

双击表 1 的值会将值复制到表 2。在Table 2 上按鼠标右键可从“删除”菜单中删除Table 2 中的列表。问题是,如果再次从table 1列表中选择已删除的值,则不会重复,无法选择。 (如果table 1列表在table 2中重复,则不会选择它。)

有没有一种简单的方法可以在保留数据的同时删除和查看数据?现在当我将按钮和QMenu运行到代码中时,我修改单元格并在删除table1列表或table2数据时重新接收数据,并且qtableview单元格值被初始化

  • 代码方法def Table2_CustomContextMenu(self,position):

if delete == action: 清除条件发生时索引的 self.modelListSave 值,并删除 self.mainTable2.model()。 removeRow(indexRow[0], self.mainTable2.rootIndex()) self.modelListSave重置self.mainTable2_model我不明白的是, self.modelListSaveself.mainTable2.model() 重复。

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *


class MainWindow(QWidget):
def __init__(self):
super().__init__()
self.resize(500, 500)

self.Table1()
self.Table2()
self.Layout()

def Table1(self):
self.select_guorpbox = QGroupBox()
self.select_guorpbox.setTitle("Article 1")

self.rowcount = 10
self.columncount = 10

self.mainTable1_model = QStandardItemModel(self.rowcount, self.columncount)
# self.mainTable1_model.setHorizontalHeaderLabels(['a', 'b', 'c', 'd'])

for i in range(self.rowcount):
for j in range(self.columncount):
table = QStandardItem("TEST[{},{}]".format(i,j))
self.mainTable1_model.setItem(i, j, table)
table.setTextAlignment(Qt.AlignCenter)

self.textFilter = QSortFilterProxyModel()
self.textFilter.setSourceModel(self.mainTable1_model)
self.textFilter.setFilterKeyColumn(2)

self.SerchLineEdit = QLineEdit()
self.SerchLineEdit.textChanged.connect(self.textFilter.setFilterRegExp)

self.mainTable1 = QTableView()
self.mainTable1.setModel(self.textFilter)
self.mainTable1.setColumnWidth(1, 150)
self.mainTable1.setColumnWidth(2, 300)
self.mainTable1.setEditTriggers(QTableView.NoEditTriggers)
self.mainTable1.setSelectionBehavior(QTableView.SelectRows)
# self.mainTable1.setContextMenuPolicy(Qt.CustomContextMenu)
self.mainTable1.doubleClicked.connect(self.Table1_DoubleClicked)
# self.mainTable1.customContextMenuRequested.connect(self.table1_CustomContextMenu)

# column auto sort
# self.mainTable1.setSizeAdjustPolicy(QAbstractScrollArea.AdjustToContents)
# self.mainTable1.resizeColumnsToContents()

v = QVBoxLayout()
v.addWidget(self.mainTable1)
self.select_guorpbox.setLayout(v)

def Table2(self):
self.serch_groupbox = QGroupBox()
self.serch_groupbox.setTitle("Article 2")
lable = QLabel("~")
lable.setFixedWidth(10)
lable.setAlignment(Qt.AlignCenter)
insertbutton = QPushButton("insert")
self.startdate = QDateEdit()
self.startdate.setDate(QDate.currentDate())
self.startdate.setFixedWidth(150)
self.startdate.setCalendarPopup(True)
self.enddate = QDateEdit()
self.enddate.setDate(QDate.currentDate())
self.enddate.setFixedWidth(150)
self.enddate.setCalendarPopup(True)
self.article_serch_button = QPushButton("ARTICL SERTCH")
self.article_serch_button.setFixedWidth(250)

self.mainTable2_model = QStandardItemModel()

self.mainTable2 = QTableView()
self.mainTable2.setSelectionBehavior(QTableView.SelectRows)
self.mainTable2.setContextMenuPolicy(Qt.CustomContextMenu)
self.mainTable2.customContextMenuRequested.connect(self.Table2_CustomContextMenu)

h1 = QHBoxLayout()
h1.addWidget(insertbutton)
h1.addWidget(self.startdate)
h1.addWidget(lable)
h1.addWidget(self.enddate)
h1.addWidget(self.article_serch_button)
h2 = QHBoxLayout()
h2.addWidget(self.mainTable2)

v = QVBoxLayout()
v.addLayout(h1)
v.addLayout(h2)

self.modelListSave = []
self.codeSave = []
self.serch_groupbox.setLayout(v)

def Table1_DoubleClicked(self):
row = []
select_row = self.mainTable1.selectedIndexes()
for row_value in range(len(select_row)):
row.append(self.mainTable1.model().data(select_row[row_value]))

if not self.codeSave:
self.modelListSave.append(row)
for i in range(len(self.modelListSave)):
for j in range(self.columncount):
self.mainTable2_model.setItem(i, j, QStandardItem(self.modelListSave[i][j]))
self.mainTable2.setModel(self.mainTable2_model)
self.codeSave.append(row[0])
spinBox = QSpinBox()
mainTable2_ModelIndex = self.mainTable2.model().index(0, 4)
self.mainTable2.setIndexWidget(mainTable2_ModelIndex, spinBox)

elif row[0] in self.codeSave:
QMessageBox.about(self, " ", "overlap.")

else:
self.modelListSave.append(row)
for i in range(len(self.modelListSave)):
for j in range(self.columncount):
self.mainTable2_model.setItem(i, j, QStandardItem(self.modelListSave[i][j]))
self.mainTable2.setModel(self.mainTable2_model)
self.codeSave.append(row[0])
for k in range(5):
spinBox = QSpinBox()
mainTable2_ModelIndex = self.mainTable2.model().index(k, 4)
self.mainTable2.setIndexWidget(mainTable2_ModelIndex, spinBox)

def Table2_CustomContextMenu(self, position):
menu = QMenu()
delete = menu.addAction("delete")
action = menu.exec_(self.mainTable2.mapToGlobal(position))
indexRow = [index.row() for index in self.mainTable2.selectionModel().selectedRows()]
if delete == action:
del self.modelListSave[indexRow[0]]
self.mainTable2.model().removeRow(indexRow[0], self.mainTable2.rootIndex())
for i in range(len(self.modelListSave)):
for j in range(self.columncount):
self.mainTable2_model.setItem(i, j, QStandardItem(self.modelListSave[i][j]))
self.mainTable2.setModel(self.mainTable2_model)
for k in range(5):
spinBox = QSpinBox()
mainTable2_ModelIndex = self.mainTable2.model().index(k, 4)
self.mainTable2.setIndexWidget(mainTable2_ModelIndex, spinBox)

def Layout(self):
self.vbox = QVBoxLayout()
self.vbox.addWidget(self.SerchLineEdit)
self.vbox.addWidget(self.select_guorpbox)
self.vbox.addWidget(self.serch_groupbox)
self.setLayout(self.vbox)

if __name__ == "__main__":
app = QApplication(sys.argv)
fream = MainWindow()
fream.show()
app.exec_()

最佳答案

根据您的逻辑,您将有关复制行的信息存储在列表中,但是当您从复制表中删除行时,不要将其从该行中删除。此外,如果模型消除了某些元素,则不会通知该列表,这就是错误的原因。

相反,最好不要使用该列表,因为必须通过迭代复制表的行来完成验证。

from PyQt5 import QtCore, QtGui, QtWidgets

class Widget(QtWidgets.QWidget):
def __init__(self, parent=None):
super(Widget, self).__init__(parent)
self.create_table_1()
self.create_table_2()
self.create_layout()

def create_table_1(self):
self.search_lineedit = QtWidgets.QLineEdit()
self.select_groupbox = QtWidgets.QGroupBox(title="Article 1")
self.main_table1_model = QtGui.QStandardItemModel(10, 10, self)

for i in range(self.main_table1_model.rowCount()):
for j in range(self.main_table1_model.columnCount()):
table = QtGui.QStandardItem("TEST[{},{}]".format(i,j))
self.main_table1_model.setItem(i, j, table)
table.setTextAlignment(QtCore.Qt.AlignCenter)

self.textfilter = QtCore.QSortFilterProxyModel(self, filterKeyColumn=2)
self.textfilter.setSourceModel(self.main_table1_model)
self.search_lineedit.textChanged.connect(self.textfilter.setFilterRegExp)

self.main_table1 = QtWidgets.QTableView()
self.main_table1.setModel(self.textfilter)
self.main_table1.setColumnWidth(1, 150)
self.main_table1.setColumnWidth(2, 300)
self.main_table1.setEditTriggers(QtWidgets.QTableView.NoEditTriggers)
self.main_table1.setSelectionBehavior(QtWidgets.QTableView.SelectRows)
self.main_table1.doubleClicked.connect(self.on_table1_doubleClicked)

v = QtWidgets.QVBoxLayout()
v.addWidget(self.main_table1)
self.select_groupbox.setLayout(v)

@QtCore.pyqtSlot(QtCore.QModelIndex)
def on_table1_doubleClicked(self, index):
row = index.row()
filters_row = self.get_items_by_row(row, self.textfilter)
for rowX in range(self.main_table2_model.rowCount()):
table_2_row = self.get_items_by_row(rowX, self.main_table2_model)
if all([item1 == item2 for item1, item2 in zip(filters_row, table_2_row)]):
QtWidgets.QMessageBox.about(self, " ", "overlap.")
return
self.main_table2_model.appendRow([QtGui.QStandardItem(text) for text in filters_row])
spinbox = QtWidgets.QSpinBox()
ix = self.main_table2_model.index(self.main_table2_model.rowCount()-1, 4)
self.main_table2.setIndexWidget(ix, spinbox)

def get_items_by_row(self, row, model):
return [model.data(model.index(row, col)) for col in range(model.columnCount())]

def create_table_2(self):
self.search_groupbox = QtWidgets.QGroupBox(title="Article 2")
label = QtWidgets.QLabel("~")
label.setFixedWidth(10)
label.setAlignment(QtCore.Qt.AlignCenter)
insertbutton = QtWidgets.QPushButton("insert")
self.startdate = QtWidgets.QDateEdit(calendarPopup=True)
self.startdate.setDate(QtCore.QDate.currentDate())
self.startdate.setFixedWidth(150)
self.enddate = QtWidgets.QDateEdit(calendarPopup=True)
self.enddate.setDate(QtCore.QDate.currentDate())
self.enddate.setFixedWidth(150)
self.article_serch_button = QtWidgets.QPushButton("ARTICL SERTCH")
self.article_serch_button.setFixedWidth(250)
self.main_table2_model = QtGui.QStandardItemModel(0, 10)
self.main_table2 = QtWidgets.QTableView()
self.main_table2.setModel(self.main_table2_model)
self.main_table2.setSelectionBehavior(QtWidgets.QTableView.SelectRows)
self.main_table2.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
self.main_table2.customContextMenuRequested.connect(self.table2_customcontextmenu)
h1 = QtWidgets.QHBoxLayout()
h1.addWidget(insertbutton)
h1.addWidget(self.startdate)
h1.addWidget(label)
h1.addWidget(self.enddate)
h1.addWidget(self.article_serch_button)
h2 = QtWidgets.QHBoxLayout()
h2.addWidget(self.main_table2)
v = QtWidgets.QVBoxLayout()
v.addLayout(h1)
v.addLayout(h2)
self.search_groupbox.setLayout(v)

@QtCore.pyqtSlot(QtCore.QPoint)
def table2_customcontextmenu(self, position):
ix = self.main_table2.indexAt(position)
if not ix.isValid():
return
menu = QtWidgets.QMenu()
delete_action = menu.addAction("delete")
action = menu.exec_(self.main_table2.viewport().mapToGlobal(position))
if action == delete_action:
self.main_table2_model.removeRow(ix.row())

def create_layout(self):
vbox = QtWidgets.QVBoxLayout(self)
vbox.addWidget(self.search_lineedit)
vbox.addWidget(self.select_groupbox)
vbox.addWidget(self.search_groupbox)

if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
w = Widget()
w.show()
sys.exit(app.exec_())

关于python - pyqt QStandardItemModel 有没有办法从模型中完全删除值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55254944/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com