<p>为了实现您的目标,您必须定制项委托,因为它们为树小部件提供演示和编辑服务。Qt文档有一些有用的<a href="http://doc.qt.digia.com/4.7-snapshot/model-view-programming.html" rel="nofollow">information regarding models, views and delegates</a>(包括<a href="http://doc.qt.digia.com/4.7-snapshot/modelview.html" rel="nofollow">tutorial</a>)。以下代码修复了使用委托的问题:</p>
<pre><code>from PyQt4.QtGui import *
from PyQt4.QtCore import *
class MyMainWindow(QMainWindow):
def __init__(self, parent=None):
QMainWindow.__init__(self, parent)
self.tree = QTreeWidget(self)
self.tree.setColumnCount(1)
self.tree.setItemDelegate(MyDelegate(self))
self.setCentralWidget(self.tree)
itemWidget = QTreeWidgetItem()
itemWidget.setFlags(itemWidget.flags() | Qt.ItemIsEditable)
itemWidget.setText(0, "very Small Text Edit")
self.tree.addTopLevelItem(itemWidget)
itemWidget2 = QTreeWidgetItem()
itemWidget2.setFlags(itemWidget.flags() | Qt.ItemIsEditable)
itemWidget2.setText(0, """very Small Text Edit\n
very Small Text Edit\n
very Small Text Editvery Small Text Editvery Small Text Editvery Small Text Editvery Small Text Editvery Small Text Editvery Small Text Editvery Small Text Editvery Small Text Editvery Small Text Editvery Small Text Editvery Small Text Editvery Small Text Editvery Small Text Editvery Small Text Editvery Small Text Editvery Small Text Editvery Small Text Editvery Small Text Editvery Small Text Edit""")
self.tree.addTopLevelItem(itemWidget2)
class MyDelegate(QStyledItemDelegate):
def sizeHint(self, option, index):
default = QStyledItemDelegate.sizeHint(self, option, index)
return QSize(default.width(), default.height() + 12)
def createEditor(self, parent, option, index):
editor = QTextEdit(parent)
return editor
def setEditorData(self, editor, index):
text = index.model().data(index, Qt.DisplayRole).toString()
editor.setText(text)
def setModelData(self, editor, model, index):
model.setData(index, QVariant(editor.toPlainText()))
if __name__ == "__main__":
import sys
app = QApplication(sys.argv)
ui = MyMainWindow()
ui.show()
sys.exit(app.exec_())
</code></pre>
<p>该代码包含<code>sizeHint()</code>的简单重新实现。还请注意,您可以在<code>createEditor</code>方法中自定义<code>QTextEdit</code>。您可能还想重新实现<code>paint()</code>方法(这取决于您的需要)。在</p>
<p>请注意,子类化<code>QTreeWidgetItem</code>不是正确的方法(它甚至不是<code>QWidget</code>)。然而,<code>QTreeWidget</code>是一个方便的类,它使用预定义的树模型,因此在模型/视图编程框架中解决问题是有意义的。在</p>