Python 像QTextEdit这样的QWidget自动将其高度包装到其内容中?

Python 像QTextEdit这样的QWidget自动将其高度包装到其内容中?,python,qt4,pyqt4,qtextedit,Python,Qt4,Pyqt4,Qtextedit,我正在使用一些QTextEdit小部件创建一个表单 QTextEdit的默认高度超过一行文本,当内容的高度超过QTextEdit的高度时,它会创建一个滚动条来滚动内容 我希望重写此行为以创建一个QTextEdit,它更愿意将其高度包装到其内容中。这意味着默认高度为一行,在换行或输入新行时,QTextEdit将自动增加其高度。每当内容高度超过QTextEdit的高度时,后者不应创建滚动条,而应简单地增加高度 我该怎么做呢?谢谢 这几乎和我前几天回答的一个问题完全一样,就是让QTextEdit根据内

我正在使用一些QTextEdit小部件创建一个表单

QTextEdit的默认高度超过一行文本,当内容的高度超过QTextEdit的高度时,它会创建一个滚动条来滚动内容

我希望重写此行为以创建一个QTextEdit,它更愿意将其高度包装到其内容中。这意味着默认高度为一行,在换行或输入新行时,QTextEdit将自动增加其高度。每当内容高度超过QTextEdit的高度时,后者不应创建滚动条,而应简单地增加高度


我该怎么做呢?谢谢

这几乎和我前几天回答的一个问题完全一样,就是让QTextEdit根据内容变化调整其高度:

我回答而不是标记一个重复的,因为我怀疑这可能是你想要一个变化。如果您希望我扩展此答案,请告诉我:

另一个问题有多个部分。以下是“身高增长”小部件的摘录:

class Window(QtGui.QDialog):

    def __init__(self):
        super(Window, self).__init__()
        self.resize(600,400)

        self.mainLayout = QtGui.QVBoxLayout(self)
        self.mainLayout.setMargin(10)

        self.scroll = QtGui.QScrollArea()
        self.scroll.setWidgetResizable(True)
        self.scroll.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn)
        self.mainLayout.addWidget(self.scroll)

        scrollContents = QtGui.QWidget()
        self.scroll.setWidget(scrollContents)

        self.textLayout = QtGui.QVBoxLayout(scrollContents)
        self.textLayout.setMargin(10)

        for _ in xrange(5):
            text = GrowingTextEdit()
            text.setMinimumHeight(50)
            self.textLayout.addWidget(text)


class GrowingTextEdit(QtGui.QTextEdit):

    def __init__(self, *args, **kwargs):
        super(GrowingTextEdit, self).__init__(*args, **kwargs)  
        self.document().contentsChanged.connect(self.sizeChange)

        self.heightMin = 0
        self.heightMax = 65000

    def sizeChange(self):
        docHeight = self.document().size().height()
        if self.heightMin <= docHeight <= self.heightMax:
            self.setMinimumHeight(docHeight)
类窗口(QtGui.QDialog): 定义初始化(自): 超级(窗口,自我)。\uuuu初始化 自动调整大小(600400) self.mainLayout=QtGui.QVBoxLayout(self) 自主布局设置边距(10) self.scroll=QtGui.QScrollArea() self.scroll.setWidgetResizeable(True) self.scroll.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn) self.mainLayout.addWidget(self.scroll) scrollContents=QtGui.QWidget() self.scroll.setWidget(scrollContents) self.textLayout=QtGui.QVBoxLayout(滚动内容) self.textLayout.setMargin(10) 对于X范围(5)内的uu: text=GrowingTextEdit() text.setMinimumHeight(50) self.textLayout.addWidget(文本) 类GrowingTextEdit(QtGui.qtexedit): 定义初始化(self,*args,**kwargs): 超级(成长文本编辑,自我)。\uuuuuu初始化(*args,**kwargs) self.document().contentsChanged.connect(self.sizeChange) self.heightMin=0 自高度最大值=65000 def大小更改(自身): docHeight=self.document().size().height()
如果self.heightMin以下代码将QTextEdit小部件设置为内容的高度:

# using QVBoxLayout in this example
grid = QVBoxLayout()
text_edit = QTextEdit('Some content. I make this a little bit longer as I want to see the effect on a widget with more than one line.')

# read-only
text_edit.setReadOnly(True)

# no scroll bars in this example
text_edit.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff) 
text_edit.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) 
text_edit.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)

# you can set the width to a specific value
# text_edit.setFixedWidth(400)

# this is the trick, we nee to show the widget without making it visible.
# only then the document is created and the size calculated.

# Qt.WA_DontShowOnScreen = 103, PyQt does not have this mapping?!
text_edit.setAttribute(103)
text_edit.show()

# now that we have a document we can use it's size to set the QTextEdit's size
# also we add the margins
text_edit.setFixedHeight(text_edit.document().size().height() + text_edit.contentsMargins().top()*2)

# finally we add the QTextEdit to our layout
grid.addWidget(text_edit)

我希望这能有所帮助。

这正是我所需要的。不过,我在搜索词中没有遇到这个问题。谢谢此外(我在你的另一篇文章中看不到这一点),我必须连接以下内容,以便在调整前者的大小时将QTextEdit的高度包装到其文档:
self.document().documentLayout().documentSizeChanged.connect(self.wrapHeightToContents)
。如果你在我的示例中看到,我在更高的位置使用了不同的信号。我不需要任何其他的connections@jdi您连接到的信号在C++中被保护:谢谢指向任何C++用户。幸运的是,这个问题围绕着python绑定:-)这是一个非常有趣的技巧,但我的一部分人认为肯定还有其他方法。但我的另一部分意识到,这可能是实践中最好的方法,因为你不必计算帧宽之类的东西并计算出来。从技术上讲,
contentsMargins().top()+contentsMargins().bottom()
contentsMargins().top()*2
更正确,尽管这些值通常是相同的。