【问题标题】:PyQt5 - How to add a scrollbar to a QMessageBoxPyQt5 - 如何向 QMessageBox 添加滚动条
【发布时间】:2018-04-30 22:37:45
【问题描述】:

我有一个根据用户输入生成的列表。

我正在尝试在 QMessageBox 中显示此列表。但是,我无法知道这个列表的长度。清单可能很长。

因此,我需要在 QMessageBox 中添加一个滚动条。

有趣的是,我到处寻找,但没有找到任何解决方案。

下面是,我希望是一个“最小、完整和可验证的例子”,当然没有用户输入;我刚刚创建了一个列表作为示例。

感谢任何建议。

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *

class W(QWidget):

   def __init__(self):
      super().__init__()

      self.initUi()

   def initUi(self):
      self.btn = QPushButton('Show Message', self)
      self.btn.setGeometry(10, 10, 100, 100)
      self.btn.clicked.connect(self.buttonClicked)
      self.lst = list(range(2000))
      self.show()


   def buttonClicked(self):
      result = QMessageBox(self)
      result.setText('%s' % self.lst)
      result.exec_()

if __name__ == "__main__":
   app = QApplication(sys.argv)
   gui = W()
   sys.exit(app.exec_())

【问题讨论】:

  • 我不认为 QMessageBox 足够灵活以允许这样做。您可能必须使用包含 QScrollArea 的更通用的 QDialog。

标签: python pyqt pyqt5 qmessagebox


【解决方案1】:

您不能直接添加滚动条,因为负责显示文本的小部件是QLabel。解决方案是添加QScrollArea。大小可能不够,因此必须使用样式表来设置最小值。

class ScrollMessageBox(QMessageBox):
   def __init__(self, l, *args, **kwargs):
      QMessageBox.__init__(self, *args, **kwargs)
      scroll = QScrollArea(self)
      scroll.setWidgetResizable(True)
      self.content = QWidget()
      scroll.setWidget(self.content)
      lay = QVBoxLayout(self.content)
      for item in l:
         lay.addWidget(QLabel(item, self))
      self.layout().addWidget(scroll, 0, 0, 1, self.layout().columnCount())
      self.setStyleSheet("QScrollArea{min-width:300 px; min-height: 400px}")

class W(QWidget):
   def __init__(self):
      super().__init__()
      self.btn = QPushButton('Show Message', self)
      self.btn.setGeometry(10, 10, 100, 100)
      self.btn.clicked.connect(self.buttonClicked)
      self.lst = [str(i) for i in range(2000)]
      self.show()


   def buttonClicked(self):
      result = ScrollMessageBox(self.lst, None)
      result.exec_()

if __name__ == "__main__":
   app = QApplication(sys.argv)
   gui = W()
   sys.exit(app.exec_())

输出:

【讨论】:

    【解决方案2】:

    这是覆盖小部件行为的另一种方法。

    您可以使用“children()”获取对小部件子级的引用。 然后您可以像操作其他任何小部件一样操作它们。

    这里我们将一个QScrollArea 和QLabel 添加到原始小部件的QGridLayout 中。我们从原始小部件的标签中获取文本并将其复制到我们的新标签中,最后我们从原始标签中清除文本,使其不显示(因为它在我们的新标签旁边)。 我们的新标签是可滚动的。我们必须设置 scrollArea 的最小尺寸,否则会很难阅读。

    import sys
    from PyQt5.QtCore import *
    from PyQt5.QtGui import *
    from PyQt5.QtWidgets import *
    
    class ScrollMessageBox(QMessageBox):
       def __init__(self, *args, **kwargs):
          QMessageBox.__init__(self, *args, **kwargs)
          chldn = self.children()
          scrll = QScrollArea(self)
          scrll.setWidgetResizable(True)
          grd = self.findChild(QGridLayout)
          lbl = QLabel(chldn[1].text(), self)
          lbl.setWordWrap(True)
          scrll.setWidget(lbl)
          scrll.setMinimumSize (400,200)
          grd.addWidget(scrll,0,1)
          chldn[1].setText('')
          self.exec_()
    
    class W(QWidget):
       def __init__(self):
          super(W,self).__init__()
          self.btn = QPushButton('Show Message', self)
          self.btn.setGeometry(10, 10, 100, 100)
          self.btn.clicked.connect(self.buttonClicked)
          self.message = ("""We have encountered an error.
    The following information may be useful in troubleshooting:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Here is the bottom.
    """)
          self.show()
    
       def buttonClicked(self):
           result = ScrollMessageBox(QMessageBox.Critical,"Error!",self.message)
    
    if __name__ == "__main__":
       app = QApplication(sys.argv)
       gui = W()
       sys.exit(app.exec_())
    

    【讨论】:

      猜你喜欢
      • 2013-10-23
      • 1970-01-01
      • 1970-01-01
      • 2020-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多