2016-03-22 8 views
1

Ich versuche, Resize-Ereignis des Fensters abzufangen, und wenn ich das tue, im Grunde alle Widget-Elemente in einem GridLayout löschen und die Zeilen/Spalten neu erstellen, um das Fenster in der Größe angepasst zu passen. Ich habe Probleme, dies richtig zu funktionieren und nicht sicher, ob dies die beste Methode ist, die ich verwendet habe. Gerade jetzt zwei Probleme auftreten:Wie kann ich ein GridLayout während der Größenänderung neu erstellen?

  1. Es scheint nicht, Artikel zu löschen, den Wiederaufbau und das Hinzufügen der Spalten richtig, wie ich das Fenster größer (einige Elemente der Größe löschen, einige hinzukommen, aber scheinen nur überlappen und passt nie auf die neue Fenstergröße).

  2. Die Größe scheint beim Start/Erstellen des Fensters aufgerufen zu werden.

class Window (QtGui.QMainWindow): 
    def __init__(self): 
     super(Window, self).__init__() 
     self.thumbs = [] 
     self.thumbWidgets = [] 

     self._resize_timer = None 
     self.resizeCompleted.connect(self.handleResizeCompleted) 

     self.setGeometry(100, 100, 800, 600) 
     self.home() 

    def home(self): 

     self.centralwidget = QtGui.QWidget(self) 

     '''MainLAYOUT 
     ''' 
     self.mainLayout = QtGui.QVBoxLayout(self.centralwidget) 

     self.thumb_tab_QGroupBox = QtGui.QGroupBox(self.centralwidget) 

     '''GroupBoxLAYOUT 
     ''' 
     self.vLayout = QtGui.QVBoxLayout(self.thumb_tab_QGroupBox) 
     self.vLayout.setObjectName("GroupVLayout") 


     #Scroll Area 
     self.thumbScrollArea = QtGui.QScrollArea(self.thumb_tab_QGroupBox) 
     self.thumbScrollArea.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn) 
     self.thumbScrollArea.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn) 
     self.thumbScrollArea.setWidgetResizable(True) 
     self.thumbScrollArea.setAlignment(QtCore.Qt.AlignLeft) 
     self.thumbScrollArea.setObjectName("thumb_scrollArea") 

     self.scrollAreaWidgetContents = QtGui.QWidget() 
     self.scrollAreaWidgetContents.setMinimumSize(QtCore.QSize(840, scrollAreaX)) 
     self.scrollAreaWidgetContents.setObjectName("scrollAreaWidgetContents") 
     self.thumbScrollArea.setWidget(self.scrollAreaWidgetContents) 

     self.vLayout.addWidget(self.thumbScrollArea) 
     self.mainLayout.addWidget(self.thumb_tab_QGroupBox) 

     #Grid in Scroll Area 
     self.gridLayoutWidget = QtGui.QWidget(self.scrollAreaWidgetContents) 
     self.gridLayoutWidget.setObjectName("gridLayoutWidget") 
     self.gridLayout_QGridLayout = QtGui.QGridLayout(self.gridLayoutWidget) 
     self.gridLayout_QGridLayout.setObjectName("gridLayout") 

     #Loads thumbnails 
     self.getThumbnails() 

     self.mainLayout.setAlignment(QtCore.Qt.AlignLeft) 
     self.setCentralWidget(self.centralwidget) 

    def resizeEvent(self, resizeEvent): 
     self.updateResizeTimer(300) 

    def updateResizeTimer(self, interval=None): 
     if self._resize_timer is not None: 
      self.killTimer(self._resize_timer) 
     if interval is not None: 
      self._resize_timer = self.startTimer(interval) 
     else: 
      self._resize_timer = None 

    def timerEvent(self, event): 
     if event.timerId() == self._resize_timer: 
      self.updateResizeTimer() 
      self.resizeCompleted.emit() 

    def handleResizeCompleted(self): 
     print('resize complete') 

     # Get new window size on resize 
     width = self.centralwidget.frameGeometry().width() 
     height = self.centralwidget.frameGeometry().height() 

     thumbsPerRow = width/200 
     print "numThumbnails per Width", thumbsPerRow 

     self.gridLayoutWidget.adjustSize() 
     self.gridLayout_QGridLayout.maximumSize() 

     for widget in self.thumbWidgets: 
      print "Removing widget", widget 
      self.gridLayout_QGridLayout.removeWidget(widget) 
      #widget.deleteLater() 

     self.populate(self.thumbWidgets, QtCore.QSize(200,200), thumbsPerRow) 

    def queryThumbnailCount(self): 
     .... 
     ... 
     .. 
     return sizeX 

    def getThumbnails(self): 
     ..... 
     .... 
     ... 
     . 
     self.createThumbWidgets(self.thumbs, QtCore.QSize(200,200)) 
     self.populate(self.thumbs, QtCore.QSize(200,200)) 

    def createThumbWidgets(self, pics, size, imagesPerRow=4, flags=QtCore.Qt.KeepAspectRatioByExpanding): 
     for pic in pics:   
      label = QtGui.QLabel("") 
      pixmap = QtGui.QPixmap(pic) 
      pixmap = pixmap.scaled(size, flags) 
      label.setPixmap(pixmap) 
      self.thumbWidgets.append(label) 


    #Add thumbnails to grid 
    def populate(self, pics, size, imagesPerRow=6, flags=QtCore.Qt.KeepAspectRatioByExpanding): 
     row = col = 0 
     for widget in self.thumbWidgets:   
      print "Adding Image to column "+str(col) 
      self.gridLayout_QGridLayout.addWidget(widget, row, col) 
      col +=1 
      if col % imagesPerRow == 0: 
       row += 1 
       col = 0   


GUI = Window() 
GUI.show() 
+0

Ich habe etwas ähnliches [hier] (https://bitbucket.org/labscript_suite/labscript_utils/src/8f4c1bea806fdf3fb722ed2adcd69881ff9845b8/qtwidgets/toolpalette.py?at=default&fileviewer=file-view-default#toolpalette.py-228). Vielleicht wird es dir helfen. –

+0

Auch das scheint unheimlich ähnlich zu [this] (http://stackoverflow.com/q/36156360/1994235) Frage, die ein paar Stunden nach Deiner geschrieben wurde. Ist das ein Hausaufgabenproblem? –

+0

Das ist ziemlich lustig ... nein, keine Hausaufgabe. Das ist etwas für die Arbeit. Aber seltsam, dass jemand das gleiche Problem hat wie ich. Ich werde versuchen, Ihren Vorschlag zu betrachten ... Gibt es einen bestimmten Abschnitt, der sich auf den Wiederaufbau des Netzes bezieht? Es scheint ziemlich lang zu sein. – Zak44

Antwort

0

besser mit einem QGraphicsView erreicht werden Dies könnte.

Erstellen Sie eine Unterklasse von QGraphicsView, die auch eine QGraphicsScene für sich selbst erstellt. Lassen Sie die Liste der Pixmaps speichern, die angezeigt werden sollen. Überschreiben Sie die resizeEvent in Ihrer Unterklasse und lassen Sie die QGraphicsScene löschen und fügen Sie alle Pixmaps mit QGraphicsPixmapItems wieder an die Szene. Bevor Sie sie zur Szene hinzufügen, erhalten Sie die gesamte Breite und Höhe von der QGraphicsView.viewport(). Sie können die Breite und Höhe der einzelnen Pixelkarten erhalten, indem Sie sie durch Zeilen/Spalten dividieren. Skalieren Sie dann jedes Pixelbild, bevor Sie es der Szene hinzufügen.

+0

Danke dafür ... während es eine andere Möglichkeit ist, zu verfolgen, bin ich davon abgerückt, dies über QGraphicsScene zu tun, weil es viel komplizierter erschien, nur ein paar einfache Thumbnails anzuzeigen. Ich werde dies als Backup verwenden, wenn ich nicht weiß, wie man das über Labels und Rasterlayout macht. – Zak44

+0

Wenn Sie 'QGraphicsView' nicht mögen, würde ich vorschlagen, dass Sie' FlowLayout' verwenden, das in [hier] demonstriert wird (http://doc.qt.io/qt-5/qtwidgets-layouts-flowlayout-example.html). . Es ist ziemlich einfach zu implementieren und kann Ihren Bedürfnissen entsprechen. Sie müssen bei einer Größenänderung nicht einmal etwas tun, das Layout erledigt das für Sie. – Marcus

+0

Eine Python-Version gefunden ... [link] http://ftp.ics.uci.edu/pub/centos0/ics-custom-build/BUILD/PyQt-x11-gpl-4.7.2/examples/layouts/ flowlayout.py Aber leider scheint es nicht kooperieren zu wollen, wenn ich das in eine scollArea werfe, was notwendig ist. Sitzt einfach dort ohne Reorganisation, wenn ich die Größe verändere. – Zak44

Verwandte Themen