我正在构建带有HTML子集的QTextEdit网格,以在PyQt的界面中显示一些数据。
此刻,我得到了GridLayout和包含它的QFrame来做他们想做的任何事情,而我没有办法使它们适合QTextEdit的大小。我用SizePolicy进行了格子处理,但不起作用。
从图像中看到每个QText的侧面如何显示多余的空间,以及GridLayout如何在高度上削减QTextEdit。
使其正常工作的唯一方法是,如果我设置了正确的QFrame大小以使所有内容适合,但由于QTextEdit的大小是可自定义的,我希望QFrame能够简单地容纳它必须包含的内容,而不是免费获取+ _ +
请注意,GridLayout通常比主窗口大,因此它不需要适合窗口,因此为什么需要scrollArea。
我不想要的:
应为:
请注意,添加此行(在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_())
最佳答案
要获得正确的大小,必须使用idealWidth()
的document()
方法,但这仅在项目可见时才是正确的,因此应在小部件可见时应用它,因此应调用show()
方法除了每次文本更改时都调用它之外,还应用了此更改。
要获得正确的高度,请使用size()
的QTextDocument()
方法
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_())
输出:
关于python - 如何使用PyQt打包-如何使QFrame/Layout适应内容,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46851971/