如何在调整大小期间重建gridLayout?

时间:2016-03-22 00:59:21

标签: resize pyqt rebuild qgridlayout

我正在尝试捕获窗口的resize事件,当我这样做时,基本上删除gridLayout中的所有窗口小部件项并重建行/列以适应新调整大小的窗口。我无法正常工作,也不确定这是否是我使用过的最佳方法。现在有两个问题发生了:

  1. 当我调整窗口大小时,它似乎没有正确删除项目,重建和添加列(一些项目删除,一些项目被添加,但似乎只是重叠,永远不适合新的窗口大小)。

  2. 调整大小似乎在启动/创建窗口时被调用。

  3. 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()
    

1 个答案:

答案 0 :(得分:0)

使用QGraphicsView可能会更好。

创建QGraphicsView的子类,同时为自己创建QGraphicsScene。让它存储您想要显示的像素图列表。覆盖子类中的resizeEvent并清除QGraphicsScene并使用QGraphicsPixmapItems将所有像素图重新添加到场景中。在将它们添加到场景之前,从QGraphicsView.viewport()获取总宽度和高度。您可以通过除以行/列来获得单个像素图宽度/高度。然后在将每个像素图添加到场景之前对其进行缩放。