- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 HTML Subset 构建 QTextEdit 网格,以在 PyQt 界面中显示一些数据。
目前我得到了 GridLayout 和包含它的 QFrame 做任何他们想做的事情,但我没有办法让它们适合 QTextEdit 大小。我用 SizePolicy 格子但不起作用。从图像中可以看到每个 QText 侧面如何出现额外的空间以及 GridLayout 如何在高度上切割 QTextEdit。
使其工作的唯一方法是,如果我设置正确的 QFrame 大小以使所有内容都适合,但由于 QTextEdit 的大小是可自定义的,我希望 QFrame 简单地适合它必须包含的任何内容,而不是获取自由意志+_+
请注意,GridLayout 通常比主窗口大,因此它不需要适合窗口,因此为什么需要滚动区域。
应该是这样:
请注意,添加此行(在 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_())
输出:
关于python - How to Pack with PyQt - 如何让QFrame/Layout适应内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46851971/
我是一名优秀的程序员,十分优秀!