最小化QTreeWidgetItem中QTextEdit的大小

时间:2012-09-12 18:32:41

标签: python pyqt4 qtextedit sizing model-view

我有一个QTreeWidget填充了一些itemwidgets,其主要小部件将是一个QTextEdit。我遇到的问题似乎是将规模缩小到可管理的状态。将大小策略设置为最大值的常用方法似乎不起作用。这是示例代码:

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.setCentralWidget(self.tree)

        textEdit = QTextEdit()
        textEdit.setText("very Small Text Edit")
        sizePolicy = QSizePolicy(QSizePolicy.Preferred, QSizePolicy.MinimumExpanding)
        textEdit.setSizePolicy(sizePolicy)

        itemWidget = QTreeWidgetItem()
        itemWidget.setText(0, "")
        self.tree.addTopLevelItem(itemWidget)
        self.tree.setItemWidget(itemWidget, 0, textEdit)        

        biggerTextEdit = QTextEdit()
        biggerTextEdit.setText("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.")        

        itemWidget2 = QTreeWidgetItem()
        itemWidget2.setText(0, "")
        self.tree.addTopLevelItem(itemWidget2)
        self.tree.setItemWidget(itemWidget2, 0, biggerTextEdit)        

if __name__ == "__main__":
    import sys
    app = QApplication(sys.argv)
    ui = MyMainWindow()
    ui.show()
    sys.exit(app.exec_())

请注意,无论文本的长度如何,似乎都不会对textedits的高度产生任何影响。如何将QTextEdit自身(垂直地,至少)缩放到最小可能的大小,并且为了知识,为什么它不像这样的许多其他小部件一样?提前谢谢!

编辑:我现在应该注意到我试图通过使用QLabel(关于调整大小,显示和单词扭曲,就像我想要的那样工作)来欺骗这种效果并设置文本交互标记为可编辑。这几乎可以用来访问Label的编辑文本。不幸的是,标签上的任何.text()调用都会产生原始文本。 QLineEdit不能是多行或自动换行,QTextEdit看起来过于复杂。

现在的问题是,创建一个可以编辑的小型(300个字符或更少)文本显示小部件的最佳小部件是什么?

2 个答案:

答案 0 :(得分:2)

为了实现您的目标,您必须自定义项目委托,因为它们为您的树窗口小部件提供演示和编辑服务。 Qt文档有一些有用的information regarding models, views and delegates(包括tutorial)。以下代码使用委托来修复您的问题:

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

代码包含sizeHint()的天真重新实现。另请注意,您可以在QTextEdit方法中自定义createEditor。您可能也希望重新实现paint()方法(这取决于您的需求)。

请注意,子类化QTreeWidgetItem不是要走的路(它甚至不是QWidget)。但是QTreeWidget是一个使用预定义树模型的便利类,因此在模型/视图编程框架中解决问题是有意义的。

答案 1 :(得分:1)

我想出了一个解决方案,涉及将QTextEdit而不是QStyledItemDelegate子类化。新的QTextEdit根据内容计算所需的高度。然后,我使用信号将计算出的高度输入到QTreeWidgetItem的{​​{1}}。

下面的代码(PS我正在使用PyQt5)

setSizeHint()