python - PyQt5 插入后立即进入编辑模式

标签 python pyqt pyqt5 python-3.6

尝试使用 QStandardItemModel 将行插入到 QTableView 中。

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

请解释一下我做错了什么。

最佳答案

导致该问题的原因是 ndx 属于 QStandardItemModel,但编辑需要一个属于在 View 中建立的模型的 QModelIndex,而该模型就是 QSortFilterProxyModel,因此必须使用mapFromSource()将属于源的QModelIndex转换为与代理对应的QModelIndex :

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)

关于python - PyQt5 插入后立即进入编辑模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52995648/

相关文章:

python - Pyqt - 我的标准 "Apply"按钮发出什么信号,我如何为它编写插槽?

python - 使用 QComboBox 选择显示的不同小部件集

php - 编写控制守护进程(及其配置文件)的 Web 应用程序的最佳实践是什么

python - 通过 QStardItemModel() 在 QTreeView()-Object 中存储和检索项目/行的数据

python - Keras Functional API 多输入层

python - 使用 PyQT 在 Python 中将二维整数数组重写为位图

python - 在 QComboBox 激活时获取上一个和新选择的项目

python - 将 x 轴刻度更改为自定义字符串

python - 多个文件中唯一的词频

python - 如何即时判断 '0'到 '9'在特定范围内被使用了多少次