2014-09-01 2 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

Это сработало отлично! Благодаря! Чтобы учесть ширину полосы прокрутки, я использовал (vars из моего примера): self.scrollArea.setMinimumWidth (self.gLayoutScroll.sizeHint(). Width() + self.scrollArea.verticalScrollBar(). SizeHint(). Width()) –

+0

@ChristopherBrown Я рад, что это сработало и для вас. Если вам нравится мой ответ, вы также можете дополнительно увеличить его (если хотите). – Trilarion

Смежные вопросы