2014-09-01 58 views
2

我想使此對話框水平展開以顯示所有圖像。我不希望它垂直擴展,因爲會有一個滾動條。 sizePolicy註釋掉的內容不起作用。這些圖像只是四張圖片,並排放置時比窗口寬。使滾動區域水平展開以適應內容

我在做什麼錯?

from PyQt4 import QtGui, QtCore 

class Images(QtGui.QDialog): 
    def __init__(self, pics, size, imagesPerRow=6, imagePopup=True, parent=None): 
     QtGui.QDialog.__init__(self) 
     self.scrollArea = QtGui.QScrollArea(self) 
     self.scrollArea.setWidgetResizable(True) 
     self.scrollAreaWidgetContents = QtGui.QWidget(self.scrollArea) 
     self.scrollArea.setWidget(self.scrollAreaWidgetContents) 
     #sp = QtGui.QSizePolicy() 
     #sp.setHorizontalPolicy(QtGui.QSizePolicy.Expanding) 
     #self.setSizePolicy(sp) 
     #self.scrollAreaWidgetContents.setSizePolicy(sp) 
     #self.scrollArea.setSizePolicy(sp) 

     self.verticalLayout = QtGui.QVBoxLayout(self) 
     self.verticalLayout.addWidget(self.scrollArea) 

     self.gLayoutScroll = QtGui.QGridLayout(self.scrollAreaWidgetContents) 

     row = col = 0 
     for pic in pics: 
      thumb = QtGui.QLabel() 
      pixmap = QtGui.QPixmap(pic) 
      pixmap = pixmap.scaled(size, QtCore.Qt.KeepAspectRatioByExpanding, QtCore.Qt.SmoothTransformation) 
      thumb.setPixmap(pixmap) 
      self.gLayoutScroll.addWidget(thumb, row, col) 

      col +=1 
      if col % imagesPerRow == 0: 
       row += 1 
       col = 0 

if __name__ == "__main__": 
    import sys 

    app = QtGui.QApplication(sys.argv) 
    app.setApplicationName('myDialog') 

    main = Images(['one.png','two.png','three.png','four.png'], size=QtCore.QSize(192,192)) 
    main.show() 

    sys.exit(app.exec_()) 

回答

3

您可以滾動區域的最小寬度正好被設置爲內容的寬度。這樣滾動區域將最初顯示內容小部件的完整水平寬度。

這是我的例子(PySide,Python 3中):

from PySide import QtGui, QtCore 

class Images(QtGui.QScrollArea): 
    def __init__(self, images): 
     super().__init__() 

     self.content = QtGui.QWidget() 
     self.layout = QtGui.QGridLayout(self.content) 
     self.layout.setSizeConstraint(QtGui.QLayout.SetFixedSize) 
     col = 0 
     for image in images: 
      thumb = QtGui.QLabel() 
      thumb.setPixmap(QtGui.QPixmap(image)) 
      self.layout.addWidget(thumb, 0, col) 
      col += 1 

     self.setWidget(self.content) 
     self.setMinimumWidth(self.content.sizeHint().width()) 
     self.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) 

app = QtGui.QApplication([]) 

window = QtGui.QWidget() 
layout = QtGui.QVBoxLayout(window) 
scroll_area = Images(['test.png','test.png','test.png','test.png']) 
layout.addWidget(scroll_area) 
window.show() 

app.exec_() 

其中設定滾動條內容的優選的寬度的最小寬度添加之後的圖像。我也關閉了水平滾動條,因爲這不是真的需要。

結果是一個水平足夠大的窗口,但不一定在垂直方向上(手動調整大小)。

expanded scroll area

兩點意見:

  • 如果內容的變化寬度,你必須再做一次。
  • 垂直滾動條將與內容小部件在內部(重疊)。如果您不希望將垂直滾動條的寬度添加到滾動區域的最小寬度。
+1

這工作得很好!謝謝!爲了說明滾動條寬度,我使用了(從我的示例中的變量):self.scrollArea.setMinimumWidth(self.gLayoutScroll.sizeHint().width()+ self.scrollArea.verticalScrollBar()。sizeHint()。width()) – 2014-09-04 20:03:12

+0

@ChristopherBrown我很高興它爲你工作。如果你喜歡我的答案,你也可以額外支持它(如果你喜歡)。 – Trilarion 2014-09-04 20:04:50