我正在尝试使当前代码显示的所有内容均不可编辑。
先前的搜索都建议修改模型的flags()函数或使用表的setEditTriggers。我在这段代码中都做到了,但是它们都不起作用。
[通过小部件查看小部件的情况,我可以找到LineEdit和其他控件的只读模式,但不能找到ComboBox的只读模式。因此,我什至不能修改委托以强制执行只读约束,而不是我一定要这样做。
编辑:为了澄清,当我说我希望用户无法“编辑”时,我的意思是他不应该以任何方式更改小部件的状态。例如。他将无法单击组合框(或至少更改当前选定的项目/索引)。
from PyQt5 import QtCore, QtWidgets
import sys
class MyWindow(QtWidgets.QWidget):
def __init__(self, *args):
super().__init__(*args)
tableview = TableView()
layout = QtWidgets.QVBoxLayout(self)
layout.addWidget(tableview)
self.setLayout(layout)
class Delegate(QtWidgets.QStyledItemDelegate):
def __init__(self, model):
super().__init__()
self.model = model
def createEditor(self, parent, option, index):
widget = QtWidgets.QComboBox(parent)
widget.addItems(['', 'Cat', 'Dog'])
return widget
def setModelData(self, widget, model, index):
self.model.setData(index, widget.currentIndex())
class Model(QtCore.QAbstractTableModel):
def __init__(self, parent=None):
QtCore.QAbstractTableModel.__init__(self, parent=parent)
self.value = 0
def flags(self, index):
return QtCore.Qt.ItemIsEnabled
def data(self, index, role=QtCore.Qt.DisplayRole):
if not index.isValid() or role != QtCore.Qt.DisplayRole:
return QtCore.QVariant()
return QtCore.QVariant(self.value)
def setData(self, index, value, role=QtCore.Qt.EditRole):
self.value = value
print("data[{}][{}] = {}".format(index.row(), index.column(), value))
return True
def rowCount(self, parent=QtCore.QModelIndex()):
return 1
def columnCount(self, parent=QtCore.QModelIndex()):
return 1
class TableView(QtWidgets.QTableView):
def __init__(self, parent=None):
super().__init__(parent)
self.model = Model(self)
delegate = Delegate(self.model)
self.setItemDelegate(delegate)
self.setModel(self.model)
self.setEditTriggers(QtWidgets.QTableWidget.NoEditTriggers)
for row in range(self.model.rowCount()):
for column in range(self.model.columnCount()):
index = self.model.index(row, column)
self.openPersistentEditor(index)
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
w = MyWindow()
w.show()
sys.exit(app.exec_())
必须澄清一些概念:
用于Qt禁用编辑视图(QListView,QTableView,QTreeView等)或视图项仅表示该编辑器不会通过用户事件(如单击,双击等)打开。
Qt中的用户交互遵循以下路径:
QEvent
并将其发送到小部件。QEvent
您应该修改的内容。在您的情况下,使用QEvent
显示小部件,因此从Qt的角度考虑,可编辑性在这种情况下无效。
考虑到上述情况,可能使小部件不可编辑的一般方法是:阻止用户小部件交互路径的某些点。在这种情况下,最简单的方法是阻止小部件通过事件过滤器接收QEvent
。
考虑到上述,解决方法是:
openPersistentEditor()
openPersistentEditor()