尝试使用 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/