<p>我想出了一个解决方案,它涉及子类化<code>QTextEdit</code>,而不是{<cd2>}。新的<code>QTextEdit</code>根据内容计算所需的高度。然后我使用一个信号将计算出的高度输入<code>QTreeWidgetItem</code>的{<cd5>}。在</p>
<p>下面的代码(PS我使用的是PyQt5)</p>
<pre><code>import sys
from PyQt5 import QtWidgets
from PyQt5.QtCore import Qt, pyqtSignal, QSize
class AdjustableTextEdit(QtWidgets.QTextEdit):
td_size_sig=pyqtSignal(QSize)
def __init__(self,parent=None):
super(AdjustableTextEdit,self).__init__(parent)
self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
self.textChanged.connect(self.resizeTextEdit)
self.document().documentLayout().documentSizeChanged.connect(
self.resizeTextEdit)
def resizeTextEdit(self):
docheight=self.document().size().height()
margin=self.document().documentMargin()
self.setMinimumHeight(docheight+2*margin)
self.setMaximumHeight(docheight+2*margin)
return
def resizeEvent(self,e):
super(AdjustableTextEdit,self).resizeEvent(e)
self.td_size_sig.emit(QSize(self.sizeHint().width(),
self.maximumHeight()))
return
class MainFrame(QtWidgets.QFrame):
def __init__(self,parent=None):
super(MainFrame,self).__init__(parent)
ha=QtWidgets.QHBoxLayout(self)
self.tree=QtWidgets.QTreeWidget(self)
ha.addWidget(self.tree)
self.addTextEditWidget('very small text edit')
self.addTextEditWidget("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas et mauris in felis tempus molestie eu sit amet sapien. Proin dapibus pretium ipsum. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Pellentesque feugiat semper sem a accumsan. Nulla sollicitudin enim quis velit blandit posuere. Ut fringilla vulputate dolor, a accumsan lectus gravida a. Sed convallis facilisis mi et ullamcorper. Integer consectetur aliquet odio sit amet posuere.")
self.show()
def addTextEditWidget(self,text):
textEdit = AdjustableTextEdit()
textEdit.setText(text)
itemWidget = QtWidgets.QTreeWidgetItem()
itemWidget.setText(0, "")
self.tree.addTopLevelItem(itemWidget)
self.tree.setItemWidget(itemWidget, 0, textEdit)
textEdit.td_size_sig.connect(lambda size: itemWidget.setSizeHint(0,size))
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
ui = MainFrame()
sys.exit(app.exec_())
</code></pre>