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

问题描述 投票:1回答:1

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

有没有一种简单的方法来删除和查看数据,同时保留它?现在,当我将按钮和QMenu运行到代码中时,我修改单元格并在删除table1 list或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_()
python python-3.x pyqt pyqt5
1个回答
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_())
© www.soinside.com 2019 - 2024. All rights reserved.