pyqt QStandardItemModel Есть ли способ полностью удалить значения из модели? - PullRequest
1 голос
/ 20 марта 2019

Двойной щелчок по значению 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_()

1 Ответ

2 голосов
/ 20 марта 2019

Согласно вашей логике, вы сохраняете информацию о скопированной строке в списке, но когда вы удаляете строку из таблицы копирования, не удаляйте ее из этой строки. Также этот список не уведомляется, если какой-либо элемент исключен моделью, что является причиной ошибки.

Вместо этого лучше не использовать этот список, для этого проверка должна выполняться путем итерации строк таблицы копирования.

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_())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...