首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >最小化QTextEdit在QTreeWidgetItem中的大小

最小化QTextEdit在QTreeWidgetItem中的大小
EN

Stack Overflow用户
提问于 2012-09-12 18:32:41
回答 2查看 2.2K关注 0票数 1

我有一个QTreeWidget,其中填充了一些项目小部件,其主要部件将是一个QTextEdit。我面临的问题似乎是把尺寸降到可以管理的程度。通常将大小策略设置为最大的方法似乎不起作用。下面是示例代码:

代码语言:javascript
运行
复制
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_())

注意,不管文本的长度如何,似乎对文本的高度没有任何影响。一个人如何拥有一个QTextEdit标尺本身(至少垂直地)到最小的大小,并且为了知识,为什么它的行为不像许多其他的小部件那样?提前感谢!

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-09-22 14:58:30

为了实现您的目标,您必须自定义项委托,因为它们为您的树小部件提供了演示和编辑服务。Qt文档有一些有用的关于模型、视图和代表的信息 (包括一个教程)。以下代码使用委托修复您的问题:

代码语言:javascript
运行
复制
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是一个很方便的类,它使用预定义的树模型,因此在模型/视图编程框架下解决这个问题是有意义的。

票数 2
EN

Stack Overflow用户

发布于 2019-03-13 11:07:35

我想出了一个解决方案,该解决方案涉及对QTextEdit而不是QStyledItemDelegate进行子类化。新的QTextEdit根据内容计算它需要的高度。然后,我使用信号将计算出来的高度输入QTreeWidgetItemsetSizeHint()

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

代码语言:javascript
运行
复制
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_())
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12394295

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档