Как перестроить gridLayout во время изменения размера?

Я пытаюсь поймать событие изменения размера окна, и когда я это делаю, в основном удаляю все элементы виджета в gridLayout и перестраиваю строки / столбцы, чтобы соответствовать новому измененному размеру окна. У меня проблемы с тем, чтобы заставить это работать должным образом, и я не уверен, что это лучший метод, который я использовал. Прямо сейчас происходят две проблемы:

  1. Кажется, он не удаляет элементы, не перестраивает и не добавляет столбцы должным образом, так как я изменяю размер окна больше (некоторые элементы удаляются, некоторые добавляются, но, похоже, просто перекрываются и никогда не соответствуют новому размеру окна).

  2. Resize вызывается при запуске / создании окна.

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 ответ

Это может быть лучше достигнуто с QGraphicsView,

Создайте подкласс QGraphicsView это также создает QGraphicsScene для себя. Пусть он сохранит список растровых изображений, которые вы хотите отобразить. Переопределить resizeEvent в вашем подклассе и проясните QGraphicsScene и повторно добавьте все растровые изображения на сцену, используя QGraphicsPixmapItems, Прежде чем добавить их в сцену, получите общую ширину и высоту из QGraphicsView.viewport(), Вы можете получить индивидуальную ширину / высоту растрового изображения путем деления на строки / столбцы. Затем масштабируйте каждое растровое изображение, прежде чем добавить его на сцену.

Другие вопросы по тегам