[PyQt5]代码添加textBrowser无法完全自适应

我尝试在PyQt5中为一个Widget(已设置垂直布局)添加QTextBrowser 具体流程是先删除再添加 并且编写了下面这段代码

其中self.ui是加载的ui文件

    def initialize_the_class_schedule(self):
        # 先把要加入的数量判断出来
        self.lessons_with_slots = []  # 初始化一下
        lessons = json.loads(read_file("../data/Curriculum/lessons.json"))  # 读一下lessons后面判断
        self.daily_config = json.loads(read_file("../data/daily_config.json"))  # 读入daily_config
        for i in self.daily_config["lessons_list"]:
            if i["name"] in lessons["special"] or i["name"] == '课间':  # 特殊课程和课间不能入内
                continue
            self.lessons_with_slots.append(i["name"])  # 加!
        # 初始化lessons_list
        # 操作的是lessons_list这个widget 先清空其中所有的QTextBrowser
        for i in self.ui.lessons_list.findChildren(QtWidgets.QTextBrowser):
            i.deleteLater()
        text_browser = QtWidgets.QTextBrowser(self.ui.lessons_list)
        text_browser.setObjectName("common_course_slots")
        text_browser.setText("s")  # todo test!!!!!!
        self.ui.lessons_list.layout().addWidget(text_browser)
        # 添加剩余len lessons_with_slots个
        for i in range(1, len(self.lessons_with_slots) + 1):
            text_browser = QtWidgets.QTextBrowser(self.ui.lessons_list)
            text_browser.setObjectName(f"lesson{i}")
            text_browser.setText(str(i))  # todo test!!!!!
            self.ui.lessons_list.layout().addWidget(text_browser)
        # 最后刷新一下
        self.ui.lessons_list.repaint()

遇到的问题

img


img


图一是我现在的效果,运行这个函数后整个窗口被强行拉大
图二是我希望实现的效果
尝试过修改最后的for循环的个数,如果添加1-4个text_browser是可以自适应成功的,但是如果再多便会往下拉伸了
如果是从qt设计师添加是正常的,可以自适应的

尝试过的解决方法

尝试过增加伸缩器,设置最大最小的方式 但是并没有任何的作用

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7605069
  • 你也可以参考下这篇文章:PyQt5在QTextBrowser中实时输出信息
  • 除此之外, 这篇博客: PyQt5随笔:QTextEdit、QTextBrowser添加的文字超出视图后,滑动条自动移至最底部,显示最新文本解决中的 搭配一定函数 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    虽然insertPlainText()显示多次输入文本时,滑动条是在顶部的。

    但通过insertPlainText()搭配一定函数也可以实现滑动条始终在底部,实现显示最新输出文本。同时,append()搭配一定函数也可以实现滑动条始终在顶部。这样可以实现更加复杂的程序设计。

    def show_text(self):
        a = '*'
        for i in range(1,50):
            text = '第' + str(i) + '次输入内容' + a * i + '\n'
            self.textEdit.insertPlainText(text)
            self.textEdit.moveCursor(QTextCursor.End)  # Start -> 位于顶部,
            # self.textEdit.verticalScrollBar().setValue(self.textEdit.verticalScrollBar().maximum())  # minimun() -> 位于顶部
    

    有两种函数开始和insertPlainText()搭配,一是self.textEdit.moveCursor(QTextCursor.End),把光标置于底部

    二是self.textEdit.verticalScrollBar().setValue(self.textEdit.verticalScrollBar().maximum()),直接把滑动条始终最大值,即底部

    结果:

    image-20200727111159232




  • 以下回答来自chatgpt:

    根据参考资料和问题描述,可以推断出问题大致为:在添加QTextBrowser之前,是否已经为Widget设置了垂直布局,是否为QTextBrowser设置了相关的宽和高属性?可以尝试使用“addWidget”方法添加QTextBrowser,可以让它自动适应Widget的大小。同时,需要提供代码片段以便更好地理解编码逻辑。

    解决方案如下:

    1.首先,确保为Widget设置了垂直布局,并在布局中添加了所需的控件,包括QTextBrowser。

    2.若需对QTextBrowser控件的大小进行设置,可以使用以下代码:

    text_browser.setFixedSize(width, height)  # 设置宽高
    

    或者使用以下代码:

    text_browser.setFixedWidth(width)  # 设置宽
    text_browser.setFixedHeight(height)  # 设置高
    

    3.使用“addWidget”方法添加QTextBrowser控件。

    vbox_layout.addWidget(text_browser)  # 将控件添加到布局中
    

    完整的代码实现如下:

    from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QTextBrowser
    
    class MainWindow(QWidget):
        def __init__(self):
            super().__init__()
            self.setWindowTitle('QTextBrowser Example')
            self.initUI()
    
        def initUI(self):
            self.setGeometry(100, 100, 400, 300)  # 设置窗口大小和位置
    
            # 创建垂直布局对象
            vbox_layout = QVBoxLayout(self)
    
            # 创建QTextBrowser对象
            text_browser = QTextBrowser(self)
            text_browser.setFixedSize(200, 100)  # 设置宽高
            text_browser.setPlainText('This is a QTextBrowser.')  # 设置文本
    
            # 将QTextBrowser添加到布局中
            vbox_layout.addWidget(text_browser)
    
    if __name__ == '__main__':
        app = QApplication([])
        window = MainWindow()
        window.show()
        app.exec()
    

    在这个例子中,我们首先创建了一个QVBoxLayout布局,在布局中添加了一个QTextBrowser控件,并对其进行了相关的属性设置和文本添加。最后将布局添加到窗口中,实现了一个基本的文本浏览器窗口。

    值得注意的是,在使用垂直布局对象添加多个控件时,它们会依次排列,按添加的顺序从上到下分别显示。如果我们不对QTextBrowser控件进行宽和高的设置,它会默认占据所有的可用空间,这时我们可以使用“addWidget”方法自动调整大小。

    完整的代码如下:

    from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QTextBrowser
    
    class MainWindow(QWidget):
        def __init__(self):
            super().__init__()
            self.setWindowTitle('QTextBrowser Example')
            self.initUI()
    
        def initUI(self):
            self.setGeometry(100, 100, 400, 300)  # 设置窗口大小和位置
    
            # 创建垂直布局对象
            vbox_layout = QVBoxLayout(self)
    
            # 创建QTextBrowser对象
            text_browser = QTextBrowser(self)
            text_browser.setPlainText('This is a QTextBrowser.')  # 设置文本
    
            # 将QTextBrowser添加到布局中
            vbox_layout.addWidget(text_browser)
    
    if __name__ == '__main__':
        app = QApplication([])
        window = MainWindow()
        window.show()
        app.exec()
    

    以上就是我对这个问题的解答,如果有不理解的地方,还请指出。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^