Eli*_*ias 3 python pyqt qitemdelegate qtextedit qstyleditemdelegate
我正在寻找在 QStyledItemDelegate 中使用多行文本编辑的干净方法。createEditor 的实现非常简单,返回一个 QTextEdit 实例
def createEditor(self, parent, option, index):
return QtGui.QTextEdit("Some text")
Run Code Online (Sandbox Code Playgroud)
但setModelData期望派生出一个 Edit WidgetQWidget作为参数而不是QTextEditsbase QScrollArea。Qt 文档还告诉我(至少在 PyQt 文档中)该setModelData函数尝试从 QWidget UserData 字段获取数据。但是,如果没有派生的编辑小部件,QWidget则无法设置数据。目前它抛出一个,因为它在编辑器上AttributeError找不到。text()
是否有一些行之有效的方法来使用非 QWidget 编辑器?或者我只是缺少一些小部件来做到这一点?
目前,我通过实例化 aQLineEdit并将其QTextEdit传递toPlainText()给 来快速解决了该问题setModelData。非常哈克!!我还可以使用鸭子类型并在派生类上实现一个text()方法QTextEdit。但这仍然不是一个好方法,不是吗?在 C++ 中有什么方法可以做到这一点?
项目委托的最低要求非常简单(有关更多详细信息,请参阅模型/视图概述)。只需创建QStyledItemDelegate的子类并重新实现方法createEditor、setEditorData和setModelData:
class Delegate(QStyledItemDelegate):
def createEditor(self, parent, options, index):
return QtGui.QTextEdit(parent)
def setEditorData(self, editor, index):
editor.setText(index.data())
def setModelData(self, editor, model, index):
model.setData(index, editor.toPlainText())
Run Code Online (Sandbox Code Playgroud)
通过这种方法,可以通过同一个委托轻松支持多种不同类型的编辑器。例如,isinstance可以使用检查来决定使用哪种类型的编辑器。下面是一个基本演示,展示了如何执行此操作:

class Delegate(QStyledItemDelegate):
def createEditor(self, parent, options, index):
return QtGui.QTextEdit(parent)
def setEditorData(self, editor, index):
editor.setText(index.data())
def setModelData(self, editor, model, index):
model.setData(index, editor.toPlainText())
Run Code Online (Sandbox Code Playgroud)