双击Table 1
的值会将值复制到Table 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.modelListSave
和self.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_()
答案 0 :(得分:2)
根据逻辑,您将有关复制行的信息存储在列表中,但是当您从复制表中删除行时,请勿将其从该行中删除。此外,如果模型中删除了某些元素,则不会通知该列表,这就是导致错误的原因。
相反,最好不要使用该列表,为此,必须通过重复复制表的行来完成验证。
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_())