Двойной щелчок по значению 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_()
Согласно вашей логике, вы храните информацию о скопированной строке в списке, но когда вы удаляете строку из таблицы копирования, не удаляйте ее из этой строки. Кроме того, этот список не уведомляется, если какой-либо элемент исключен моделью, что является причиной ошибки.
Вместо этого лучше не использовать этот список, для этого проверка должна выполняться путем перебора строк таблицы копирования.
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_())
Эта статья взята из Интернета, укажите источник при перепечатке.
Если есть какие-либо нарушения, пожалуйста, свяжитесь с[email protected] Удалить.
я говорю два предложения