双击Table 1
的值将该值复制到Table 2
。在Table 2
上按鼠标右键可从删除菜单中删除Table 2
中的列表。问题是,如果您再次从table 1
列表中选择已删除的值,它将不会被复制,也无法被选择。(如果table 1
列表在table 2
中重复,则不选中它。)
有没有一种简单的方法可以在保存数据的同时删除和查看数据?现在,当我在代码中运行button和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.modelListSave
和{
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_()
根据您的逻辑,您将有关复制行的信息存储在一个列表中,但是当您从复制表中删除一行时,不要将其从该行中删除。此外,如果模型删除了某些元素,则不会通知该列表,因此这是错误的原因。在
最好不要用表的复制来验证。在
相关问题 更多 >
编程相关推荐