PySide Qt:TextEdit Widget的自动垂直增长以及垂直布局中的Widget之间的间距

发布于 2021-01-29 16:05:06

在此处输入图片说明

我需要使用上面的小部件解决两个问题。

  1. 我希望能够定义图像中显示的帖子小部件之间放置的空间量(它们看起来很好,但我想知道它已经完成了)。
  2. 我想根据包含的文本量垂直增加文本编辑,而不水平增加。

对于1,填充小部件的代码如下:

self._body_frame = QWidget()
self._body_frame.setMinimumWidth(750)
self._body_layout = QVBoxLayout()
self._body_layout.setSpacing(0)
self._post_widgets = []
for i in range(self._posts_per_page):
    pw = PostWidget()
    self._post_widgets.append(pw)
    self._body_layout.addWidget(pw)

    self._body_frame.setLayout(self._body_layout)

SetSpacing(0)不会使事情变得更近,但是SetSpacing(100)确实会增加它。

编辑

(对于问题2)我没有提到这一点,但是我希望父窗口小部件具有垂直滚动条。

我已经回答了我自己的问题,但是它的罗word,并基于因果关系。解决这两个问题的正确的教程风格的正确答案会得到赏金:D

编辑2

在下面使用我自己的答案,我已经解决了问题。我现在将接受自己的回答。

在此处输入图片说明

关注者
0
被浏览
45
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    1)布局

    此处的另一个答案非常不清楚,可能与布局边距的工作方式有关。它实际上非常简单。

    1. 布局具有内容边距
    2. 小部件具有内容边距

    这两个都围绕它们包含的内容定义了一个填充。布局上的边距设置为2意味着在所有边上填充2个像素。如果您有父子窗口小部件和布局(在编写UI时总是如此),则每个对象都可以具有特定的边距,这些边距会分别生效。也就是说…将页边距指定为2的父级布局,将页边距指定为2的子级布局将有效地显示4个像素的页边距(显然,如果小部件具有框架,则在它们之间会绘制一些框架。

    一个简单的布局示例说明了这一点:

    w = QtGui.QWidget()
    w.resize(600,400)
    
    layout = QtGui.QVBoxLayout(w)
    layout.setMargin(10)
    frame = QtGui.QFrame()
    frame.setFrameShape(frame.Box)
    layout.addWidget(frame)
    
    layout2 = QtGui.QVBoxLayout(frame)
    layout2.setMargin(20)
    frame2 = QtGui.QFrame()
    frame2.setFrameShape(frame2.Box)
    layout2.addWidget(frame2)
    

    布局图像示例

    您可以看到顶级边距在每一侧都是10,子布局在每一侧都是20。数学上没有什么真正复杂的。

    保证金也可以逐个指定:

    # left: 20, top: 0, right: 20, bottom: 0
    layout.setContentsMargins(20,0,20,0)
    

    还可以选择在布局上设置间距。间距是放置在布局的每个子元素之间的像素数量。将其设置为0表示它们彼此对立。间距是布局的特征,而空白是整个对象的特征。布局周围可以有边距,子元素之间也可以有间距。并且,小部件的子项可以有自己的边距,这些边距是其各个显示的一部分。

    layout.setSpacing(10) # 10 pixels between each layout item
    

    2)自动调整大小的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)
    

    我将其子类化为QTextEdit->
    GrowingTextEdit,并将从其文档发出的信号连接到sizeChange用于检查文档高度的插槽。我还包括了heightMin和heightMax属性,可让您指定允许自动增长的大小。如果您尝试这样做,您会看到在框中输入内容时,小部件将开始自动调整大小,并且在删除行时也会缩小。您也可以根据需要关闭滚动条。现在,除了父滚动区域外,每个文本编辑都有自己的条形图。另外,我认为您可以在上添加一个小的填充值,以docHeight使其扩展到足以不显示内容的滚动条的程度。

    这种方法的水平不是很低。它使用通常公开的信号和小部件的子成员来接收状态更改的通知。利用信号扩展现有窗口小部件的功能是很常见的。

    自动增长小部件示例图片



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看