gpt4 book ai didi

python - PySide Qt : Auto vertical growth for TextEdit Widget, 和垂直布局中小部件之间的间距

转载 作者:太空狗 更新时间:2023-10-29 20:17:20 26 4
gpt4 key购买 nike

enter image description here

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

  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)我没有提到这个,但我希望父控件有一个垂直滚动条。

我已经回答了我自己的问题,但它很冗长,而且是基于因果关系的。一个写得很好的教程风格的答案来解决这两点得到赏金 :D

编辑2

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

enter image description here

最佳答案

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)

Layout Image Example

可以看到top level margin每边10,child layout每边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 添加一个小填充值,以便它扩展到足以不显示内容的滚动条。

这种方法并不是真正的低级。它使用小部件的常用信号和子成员来接收状态更改通知。使用信号来扩展现有小部件的功能是很常见的。

Auto-Growing widget example picture

关于python - PySide Qt : Auto vertical growth for TextEdit Widget, 和垂直布局中小部件之间的间距,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11677499/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com