pyqt QStandardItemModel Есть ли способ полностью удалить значения из модели?

Темная материя

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

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

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

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] Удалить.

Отредактировано в
0

я говорю два предложения

0обзор
Войти в системуУчаствуйте в комментариях

Статьи по теме

PyQt: как подключить QStandardItem в QStandardItemModel к функции

Просмотреть QStandardItemModel со столбцом флажков в PySide / PyQt?

Ошибка? В PyQt5 реализация rowCount () для QStandardItemModel имеет странные эффекты

Добавить класс в QStandardItemModel

Скопируйте QStandardItemModel в другой

QStandardItemModel - добавить строку только с одним элементом

Поиск / удаление строки из QStandardItemModel по данным элемента

Добавление строки с виджетами и текстом к QStandardItemModel

Базовый операнд '->' имеет тип без указателя 'QStandardItemModel'

Распределение элементов в QStandardItemModel

Как полностью перебрать QStandardItemModel?

СИГНАЛ: QStandarditemmodel :: datachanged (...) не испускает роли при использовании QStandarditemmodel :: setData (...))

Как использовать VXYModelMapper с QStandardItemModel?

QStandardItemModel не всегда обновляет QTreeView

Есть ли способ преобразовать модель QTableView в QStandardItemModel

Найти индекс для QStandardItemModel при активированном вызове QCompleter

Как получить доступ к вложенным элементам QStandardItemModel из QML?

Как использовать VXYModelMapper с QStandardItemModel?

Отредактируйте QStandardItemModel через TableView с помощью настраиваемого делегата

QTreeView с QStandardItemModel: как реализовать собственную модель сортировки

Можно ли центрировать проверяемый элемент Qstandard в столбце QStandardItemModel?

Как копировать - вставить несколько элементов формы QTableView, созданный QStandardItemModel в текстовый файл / Excel?

В чем разница между методами setData, setItemData и setIem QStandardItemModel?

QStandardItemModel itemChanged non appelé

Почему мой метод QStandardItemModel itemFromIndex возвращает None? (индекс недействителен)

Просмотр содержимого QStandardItemModel в представлении локальных переменных в Qt Creator

Генерация QStandardItemModel из бэкэнда Python приводит к "неопределенному" объекту QML

QStandardItemModel из C ++ не отображается в QtQuick / QML TableView

Как происходит внедрение PyQt?

TOP список

  1. 1

    Распределение Рэлея Curve_fit на Python

  2. 2

    How to click an array of links in puppeteer?

  3. 3

    В типе Observable <unknown> отсутствуют следующие свойства из типа Promise <any>.

  4. 4

    Как добавить Swagger в веб-API с поддержкой OData, работающий на ASP.NET Core 3.1

  5. 5

    Нарисуйте диаграмму с помощью highchart.js

  6. 6

    无法通过Vue在传单中加载pixiOverlay

  7. 7

    Отчеты Fabric Debug Craslytic: регистрация, отсутствует идентификатор сборки, применить плагин: io.fabric

  8. 8

    Статус HTTP 403 - ожидаемый токен CSRF не найден

  9. 9

    TypeError: store.getState não é uma função. (Em 'store.getState ()', 'store.getState' é indefinido, como posso resolver esse problema?

  10. 10

    ContentDialog.showAsync в универсальном оконном приложении Win 10

  11. 11

    В UICollectionView порядок меняется автоматически

  12. 12

    Merging legends in plotly subplot

  13. 13

    Elasticsearch - Нечеткий поиск не дает предложения

  14. 14

    Bogue étrange datetime.utcnow()

  15. 15

    Объединение таблиц в листе Google - полное соединение

  16. 16

    Single legend for Plotly subplot for line plots created from two data frames in R

  17. 17

    как я могу удалить vue cli 2?

  18. 18

    ViewPager2 мигает / перезагружается при смахивании

  19. 19

    Компилятор не знает о предоставленных методах Trait

  20. 20

    JDBI - В чем разница между @define и @bind в JDBI?

  21. 21

    проблемы с AVG и LIMIT SQL

популярныйтег

файл