2017-11-17 6 views
0

Ich habe eine Liste, die basierend auf Benutzereingabe generiert wird.PyQt5 - Hinzufügen einer Bildlaufleiste zu einer QMessageBox

Ich versuche, diese Liste in einer QMessageBox anzuzeigen. Aber ich habe keine Möglichkeit, die Länge dieser Liste zu kennen. Die Liste könnte lang sein.

Daher muss ich der QMessageBox eine Bildlaufleiste hinzufügen.

Interessanterweise schaute ich überall hin, aber ich habe keine Lösungen dafür gefunden.

Unten ist, was ich hoffe, ein "Minimal, komplettes und überprüfbares Beispiel", natürlich ohne die Benutzereingabe zu sein; Ich habe gerade eine Liste als Beispiel erstellt.

Ich freue mich über jeden Hinweis.

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

Ich glaube nicht, QMessageBox flexibel genug ist, dass zu ermöglichen. Möglicherweise müssen Sie einen allgemeineren QDialog verwenden, der eine QScrollArea enthält. – BrenBarn

+0

@BrenBarn Vielen Dank, ja Sie haben absolut Recht –

Antwort

1

Sie keine Scrollbar direkt seit dem Widget verantwortlich für die Darstellung des Textes in einem QLabel, die Lösung ein QScrollArea hinzuzufügen ist hinzufügen kann, kann die Größe nicht ausreicht, so dass es Stylesheet verwendet wird, auf ein Minimum zu setzen Werte.

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

Ausgang:

enter image description here

+0

Vielen Dank, ich schätze es. –

Verwandte Themen