erduotong 2023-06-21 23:13 采纳率: 100%
浏览 92
已结题

[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设计师添加是正常的,可以自适应的

尝试过的解决方法

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

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-06-22 08:08
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:
    • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: 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()
      

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


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 7月1日
  • 已采纳回答 6月23日
  • 创建了问题 6月21日