2016-03-22 2 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. Храните ли вы список отображаемых ими картинок, которые вы хотите отобразить. Переопределите resizeEvent в вашем подклассе и очистите его QGraphicsScene и добавьте все пиксельные изображения в сцену, используя QGraphicsPixmapItems. Прежде чем добавить их на сцену, получите общую ширину и высоту от QGraphicsView.viewport(). Вы можете получить отдельную ширину/высоту pixmap путем деления на строки/столбцы. Затем масштабируйте каждую pixmap, прежде чем добавлять ее в сцену.

+0

Спасибо за это ... пока это еще один способ преследовать, я отклонился от этого через QGraphicsScene, потому что это казалось намного более сложным, просто отображая простые эскизы. Я буду использовать это как резервную копию, если не могу понять, как это сделать с помощью меток и gridlayout. – Zak44

+0

Если вам не нравится 'QGraphicsView', я бы предложил вам использовать' FlowLayout', продемонстрированный в [здесь] (http://doc.qt.io/qt-5/qtwidgets-layouts-flowlayout-example.html) , Его довольно легко реализовать и может удовлетворить ваши потребности. Вам даже не нужно специально делать что-либо во время изменения размера, макет заботится о нем для вас. – Marcus

+0

Нашел версию python здесь ... [ссылка] http://ftp.ics.uci.edu/pub/centos0/ics-custom-build/BUILD/PyQt-x11-gpl-4.7.2/examples/layouts/ flowlayout.py Но, к сожалению, он, похоже, не хочет сотрудничать, если я бросаю это в scollArea, что необходимо. Просто сидит там без реорганизации, если я изменяю размер. – Zak44