gpt4 book ai didi

python - PyQt : Using QTextEdit as editor in a QStyledItemDelegate

转载 作者:行者123 更新时间:2023-11-28 22:43:33 26 4
gpt4 key购买 nike

我正在寻找在我的 QStyledItemDelegate 中使用多行文本编辑的简洁方式。通过返回 QTextEdit 实例,createEditor 实现非常简单

def createEditor(self, parent, option, index):
return QtGui.QTextEdit("Some text")

但是 setModelData 期望从 QWidget 派生的 Edit Widget 作为参数而不是 QTextEdits base QScrollArea。 Qt 文档也 tells me (至少在 PyQt 文档中)setModelData 函数尝试从 QWidget UserData 字段获取数据。但是如果没有从 QWidget 派生的编辑小部件,则没有设置数据的选项。目前它抛出一个 AttributeError 因为它在编辑器上找不到 text()

是否有一些行之有效的方法来使用非 QWidget 编辑器?还是我只是缺少一些小部件来执行此操作?

目前,我通过使用 toPlainText() 中的 QTextEdit 数据实例化一个 QLineEdit 并将其传递给 setModelData 来快速解决这个问题。非常哈克!我也可以使用 duck typing 并在 QTextEdit 派生上实现一个 text() 方法。但仍然不是一个好方法,不是吗?在 C++ 中有什么方法可以做到这一点?

最佳答案

项目委托(delegate)的最低要求非常简单。您需要做的就是重新实现 createEditorsetEditorDatasetModelData:

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())

使用此解决方案,可以轻松地通过同一个委托(delegate)支持多种不同类型的编辑器。例如,isinstance 检查可用于决定使用哪种类型的编辑器:

    def setModelData(self, editor, model, index):
if isinstance(editor, QtGui.QTextEdit):
model.setData(index, editor.toPlainText())
elif isinstance(editor, QtGui.QComboBox):
model.setData(index, editor.currentText())
else:
super(Delegate, self).setModelData(editor, model, index)

参见 A Simple Delegate 部分在Model/View Overview对于一些 C++ 示例。

关于python - PyQt : Using QTextEdit as editor in a QStyledItemDelegate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30615090/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com