Python 如何使用PyQt打包-如何使QFrame/Layout适应内容

Python 如何使用PyQt打包-如何使QFrame/Layout适应内容,python,pyqt,pyqt5,qgridlayout,qtextbrowser,Python,Pyqt,Pyqt5,Qgridlayout,Qtextbrowser,我正在用HTML子集构建一个QTextEdit网格,以显示PyQt中接口内的一些数据 目前,我得到了GridLayout和包含它的QFrame,它们可以做任何它们想做的事情,我没有办法使它们适合QTextEdit的大小。我用大方格布做格子,但不起作用。 从图像中可以看到每个QText的侧面显示了多少额外的空间,以及GridLayout如何在高度上剪切QTextEdit 唯一可行的方法是,如果我设置了正确的QFrame大小以使所有内容都适合,但是由于QTextEdit的大小是可定制的,我希望QFr

我正在用HTML子集构建一个QTextEdit网格,以显示PyQt中接口内的一些数据

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

唯一可行的方法是,如果我设置了正确的QFrame大小以使所有内容都适合,但是由于QTextEdit的大小是可定制的,我希望QFrame只适合它必须包含的任何内容,而不是随意设置+_+

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

我不想要的是:

应该是:

请注意,通过添加以下行(在MainFrame()中)获得了我想要的图像:

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

导入系统 从PyQt5.QtWidgets导入* 从PyQt5.QtGui导入* 从PyQt5.QtCore导入* 从随机导入* 类框(QTextBrowser): 定义初始化(自): super()。\uuuu init\uuuuu() self.setText(“”) 布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉 布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉 ''') self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff) self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) self.setContentsMargins(0,0,0,0) cstring=“” QTextBrowser{ 边界:0; 背景色:#; 边际:0px; 左侧填充:0; 填充顶部:0; 填充底部:0; 右边填充:0; } """ ncol=randint(30000099999) cstring=cstring.replace(“”,str(ncol)) 自设置样式表(cstring) 类大型机(QScrollArea): 定义初始化(自): super()。\uuuu init\uuuuu() 容器=QFrame(自身) 布局=QGridLayout(容器) 对于范围(0,5)中的行: 对于范围(0,10)中的列: addWidget(布局,框(),行,列) self.setWidget(容器) 容器设置策略(QSizePolicy.Minimum,QSizePolicy.Minimum) 布局。设置内容边缘(0,0,0,0) 布局。设置间距(0) self.show() 如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu': app=QApplication(sys.argv) ex=大型机() sys.exit(app.exec_())
要获得正确的大小,您必须使用
document()
idealWidth()
方法,但这仅在项目可见时才正确,因此您应该在小部件可见时应用它,因此您应该调用应用此更改的
show()
方法,除了在每次文本更改时调用它之外

要获得正确的高度,请使用
QTextDocument()

类框(QTextBrowser):
def uuu init uuu(self,parent=None):
QTextBrowser.\uuuuu init\uuuuuu(自,父)
self.setContentsMargins(0,0,0,0)
self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
cstring=“”
QTextBrowser{
边界:0;
背景色:#;
边际:0px;
左侧填充:0;
填充顶部:0;
填充底部:0;
右边填充:0;
}
"""
ncol=randint(30000099999)
cstring=cstring.replace(“”,str(ncol))
自设置样式表(cstring)
self.document().contentsChange.connect(lambda:self.customGeometry())
self.setSizePolicy(QSizePolicy.Preferred,QSizePolicy.Preferred)
self.setContentsMargins(0,0,0,0)
定义自定义几何体(自):
如果self.isVisible():
self.setFixedWidth(self.document().idealWidth())
self.setFixedHeight(self.document().size().height())
def showEvent(自我、事件):
self.customGeometry()
QTextBrowser.showEvent(self,event)
类大型机(QScrollArea):
def uuu init uuu(self,parent=None):
QScrollArea.\uuuuuu初始\uuuuuuuuuuu(自我,父)
容器=QFrame(自身)
布局=QGridLayout(容器)
布局。设置间距(0)
layout.setContentsMargins(0,0,0,0)
self.show()
文本='''
布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉
布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉
'''
对于范围(5)中的行:
对于范围(10)中的列:
盒子=盒子(容器)
box.setText(文本)
box.show()
layout.addWidget(框、行、列)
self.setWidget(容器)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
导入系统
app=QApplication(sys.argv)
ex=大型机()
例如:show()
sys.exit(app.exec_())
输出:


你可以显示你想要得到的东西的图像。@eyllanesc好的,谢谢你的建议,我编辑了一个问题:为什么要创建一个QTextBrowser并在其中嵌入另一个QTextBrowser?假设每个QTextBrowser的内容不同,所以理想的大小也不同,在这种情况下,你希望你的小部件是什么样的
container.resize(1100,1360)
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_())
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_())