gpt4 book ai didi

python - How to Pack with PyQt - 如何让QFrame/Layout适应内容

转载 作者:行者123 更新时间:2023-12-01 02:30:43 26 4
gpt4 key购买 nike

我正在使用 HTML Subset 构建 QTextEdit 网格,以在 PyQt 界面中显示一些数据。

目前我得到了 GridLayout 和包含它的 QFrame 做任何他们想做的事情,但我没有办法让它们适合 QTextEdit 大小。我用 SizePolicy 格子但不起作用。从图像中可以看到每个 QText 侧面如何出现额外的空间以及 GridLayout 如何在高度上切割 QTextEdit。

使其工作的唯一方法是,如果我设置正确的 QFrame 大小以使所有内容都适合,但由于 QTextEdit 的大小是可自定义的,我希望 QFrame 简单地适合它必须包含的任何内容,而不是获取自由意志+_+

请注意,GridLayout 通常比主窗口大,因此它不需要适合窗口,因此为什么需要滚动区域。

我不想要什么: What I do not want to Happen

应该是这样:

What I want to happen请注意,添加此行(在 MainFrame() 中)已获得我想要的图像:

container.resize(1100,1360)

正如我所说,我想要获得相同的行为,但不指定 QFrame 的维度,这应该适合内容(子集 HTML 表格)

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from random import *

class Box(QTextBrowser):

def __init__(self):
super().__init__()

self.setText('''
<table border="0" cellspacing="0" cellpadding="5" style="background-color: rgba(119, 212, 212, 0.7);">
<tr>
<td width="100">
bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla
</td>
<tr>
<tr>
<td>
bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla
</td>
<tr>
</table>

''')

self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)

self.setContentsMargins(0,0,0,0)

cstring ="""
QTextBrowser {
border: 0;
background-color: #<---->;
margin: 0px;
padding-left:0;
padding-top:0;
padding-bottom:0;
padding-right:0;
}
"""

ncol = randint(300000, 999999)

cstring = cstring.replace('<---->', str(ncol))

self.setStyleSheet(cstring)


class MainFrame(QScrollArea):
def __init__(self):
super().__init__()

container = QFrame(self)


layout = QGridLayout(container)

for row in range(0, 5):
for col in range(0, 10):
QGridLayout.addWidget(layout, Box(), row, col)

self.setWidget(container)

container.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Minimum)

layout.setContentsMargins(0,0,0,0)
layout.setSpacing(0)

self.show()


if __name__ == '__main__':

app = QApplication(sys.argv)
ex = MainFrame()
sys.exit(app.exec_())

最佳答案

要获得正确的尺寸,您必须使用 document()idealWidth() 方法,但这仅在项目可见时才是正确的,因此您应该当小部件可见时应用它,因此除了每次文本更改时调用它之外,您还应该调用应用此更改的 show() 方法。

要获取正确的高度,请使用 QTextDocument()size() 方法

class Box(QTextBrowser):
def __init__(self, parent=None):
QTextBrowser.__init__(self, parent)
self.setContentsMargins(0, 0, 0, 0)
self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)

cstring = """
QTextBrowser {
border: 0;
background-color: #<---->;
margin: 0px;
padding-left:0;
padding-top:0;
padding-bottom:0;
padding-right:0;
}
"""

ncol = randint(300000, 999999)
cstring = cstring.replace('<---->', str(ncol))
self.setStyleSheet(cstring)

self.document().contentsChange.connect(lambda: self.customGeometry())
self.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Preferred)
self.setContentsMargins(0, 0, 0, 0)

def customGeometry(self):
if self.isVisible():
self.setFixedWidth(self.document().idealWidth())
self.setFixedHeight(self.document().size().height())

def showEvent(self, event):
self.customGeometry()
QTextBrowser.showEvent(self, event)


class MainFrame(QScrollArea):
def __init__(self, parent=None):
QScrollArea.__init__(self, parent)
container = QFrame(self)

layout = QGridLayout(container)
layout.setSpacing(0)
layout.setContentsMargins(0, 0, 0, 0)
self.show()

text = '''
<table border="0" cellspacing="0" cellpadding="5" style="background-color: rgba(119, 212, 212, 0.7);">
<tr>
<td width="100">
bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla
</td>
<tr>
<tr>
<td>
bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla
</td>
<tr>
</table>
'''

for row in range(5):
for col in range(10):
box = Box(container)
box.setText(text)
box.show()
layout.addWidget(box, row, col)

self.setWidget(container)


if __name__ == '__main__':
import sys

app = QApplication(sys.argv)
ex = MainFrame()
ex.show()
sys.exit(app.exec_())

输出:

enter image description here

关于python - How to Pack with PyQt - 如何让QFrame/Layout适应内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46851971/

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