簡體   English   中英

PyQt5 - 如何向 QMessageBox 添加滾動條

[英]PyQt5 - How to add a scrollbar to a QMessageBox

我有一個基於用戶輸入生成的列表。

我正在嘗試在 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_())

您不能直接添加滾動條,因為負責顯示文本的小部件是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_())

輸出:

在此處輸入圖片說明

這是覆蓋小部件行為的另一種方法。

您可以使用“children()”獲取對小部件子代的引用。 然后您可以像操作任何其他小部件一樣操作它們。

在這里,我們將 QScrollArea 和 QLabel 添加到原始小部件的 QGridLayout。 我們從原始小部件的標簽中獲取文本並將其復制到我們的新標簽,最后我們從原始標簽中清除文本使其不顯示(因為它在我們的新標簽旁邊)。 我們的新標簽是可滾動的。 我們必須設置滾動區域的最小大小,否則會很難閱讀。

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_())

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM