2016-03-22 32 views
1

我想抓住窗口的大小調整事件,當我這樣做時,基本上刪除gridLayout中的所有小部件項目,並重新構建行/列以適應新的大小調整後的窗口。我無法正常工作,不確定這是否是我使用過的最佳方法。現在兩個問題發生:如何在調整大小期間重建gridLayout?

  1. 它似乎並沒有被刪除的項目,改建和適當添加列,因爲我調整窗口的大小大(有些項目刪除,有的會添加,但似乎只是重疊,從來不適合新的窗口大小)。

  2. 調整大小似乎被調用窗口的開始/創建。

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

我沒有類似的東西[這裏](https://bitbucket.org/labscript_suite/labscript_utils/src/8f4c1bea806fdf3fb722ed2adcd69881ff9845b8/qtwidgets/toolpalette.py?at=default&fileviewer=file-view-default#toolpalette.py-228)。也許它會幫助你。 –

+0

此外,這似乎與此之後幾個小時發佈的[this](http://stackoverflow.com/q/36156360/1994235)問題非常類似。這是一個家庭作業問題嗎? –

+0

這很有趣......不,不是家庭作業。這是工作的東西。但奇怪的是,有人遇到同樣的問題。我會試着看看你的建議...是否有一個與重建網格有關的特定部分?它似乎相當長。 – Zak44

回答

0

這可能與QGraphicsView更好地實現。

創建一個QGraphicsView的子類,它也爲其自身創建一個QGraphicsScene。讓它存儲你想要它顯示的pixmaps列表。覆蓋您的子類中的resizeEvent,並清除QGraphicsScene,並使用QGraphicsPixmapItems將所有像素映射重新添加到場景中。在將它們添加到場景之前,請從QGraphicsView.viewport()獲取總寬度和高度。您可以通過除以行/列來獲得單個像素圖的寬度/高度。然後縮放每個像素圖,然後將其添加到場景中。

+0

感謝你這麼做......雖然它是追求的另一個途徑,但我通過QGraphicsScene偏離了這個目標,因爲它僅僅顯示一些簡單的縮略圖顯得複雜得多。如果我不知道如何通過標籤和網格佈局來做到這一點,我會將其用作備份。 – Zak44

+0

如果你不喜歡'QGraphicsView',我建議你使用'[這裏]演示的FlowLayout'(http://doc.qt.io/qt-5/qtwidgets-layouts-flowlayout-example.html) 。 它很容易實現,可能適合您的需求。在調整大小時,您甚至不需要專門做任何事情,佈局會爲您處理它。 – Marcus

+0

在這裏找到一個python版本... [link] http://ftp.ics.uci.edu/pub/centos0/ics-custom-build/BUILD/PyQt-x11-gpl-4.7.2/examples/layouts/ flowlayout.py但不幸的是,它似乎並不想合作,如果我把它扔進scollArea,這是必要的。如果我調整大小,就坐在那裏,不要重新組織。 – Zak44

相關問題