PyQt5 входит в режим редактирования сразу после вставки - PullRequest
0 голосов
/ 25 октября 2018

Попытка вставить строку в QTableView, используя QStandardItemModel.

from PyQt5.QtCore import Qt, QSortFilterProxyModel, QModelIndex, QSize
from PyQt5.QtGui import QStandardItemModel
from PyQt5.QtWidgets import QWidget, QTableView, QPushButton, QVBoxLayout, QAbstractItemView


class SclDataBrowse(QWidget):
    def __init__(self, parent=None):
        super(SclDataBrowse, self).__init__(parent)
        self.resize(336, 462)
        self.layout = QVBoxLayout(self)
        self.view = QTableView(self)
        self.btn_New = QPushButton(self)
        self.btn_New.setMinimumSize(QSize(70, 21))
        self.btn_New.setMaximumSize(QSize(70, 21))
        self.btn_New.setText('New')
        self.layout.addWidget(self.view)
        self.layout.addWidget(self.btn_New)
        self.model = QStandardItemModel()
        self.proxy = QSortFilterProxyModel()
        self.setup_ui()
        self.setup_connections()

    def setup_ui(self):
        self.model.setColumnCount(4)
        self.model.setHorizontalHeaderLabels(["Record ID", "Starting Receipts", "Ending Receipts", "Billing Rate"])
        self.proxy.setSortCaseSensitivity(Qt.CaseInsensitive)
        self.proxy.setSourceModel(self.model)
        self.view.setModel(self.proxy)
        self.view.verticalHeader().setVisible(False)
        self.view.verticalHeader().setDefaultSectionSize(22)
        self.view.setEditTriggers(QAbstractItemView.AllEditTriggers)

    def setup_connections(self):
        self.btn_New.clicked.connect(self.add_record)

    def add_record(self):
        row = self.model.rowCount()
        self.model.insertRow(row)
        ndx = self.model.index(row, 1, QModelIndex())
        self.view.edit(ndx)

Не удается перевести таблицу в режим редактирования, и я получаю сообщение об ошибке:

edit: index was invalid
edit editing failed

Пожалуйста, объясните, что я делаю неправильно.

1 Ответ

0 голосов
/ 26 октября 2018

Проблема вызвана тем, что ndx принадлежит QStandardItemModel, но для редактирования требуется QModelIndex, принадлежащее модели, которая была установлена ​​в представлении, и эта модель - QSortFilterProxyModel, поэтому вам нужно преобразовать QModelIndexкоторый принадлежит источнику к QModelIndex, соответствующему прокси с mapFromSource():

def add_record(self):
    row = self.model.rowCount()
    self.model.insertRow(row)
    ndx = self.model.index(row, 1)
    ix = self.proxy.mapFromSource(ndx) 
    self.view.edit(ix)
...