使滚动区域水平扩展以适应内容
我想让这个对话框横向展开,以显示所有图片。我不想让它竖向展开,因为那样会出现滚动条。注释掉的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_())
1 个回答
5
你可以把滚动区域的最小宽度设置成内容的宽度。这样一来,滚动区域就会一开始就显示内容小部件的完整横向宽度。
下面是我的一个例子(使用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_()
在这里,我把滚动条的最小宽度设置为添加图片后内容的理想宽度。同时,我把横向滚动条关掉,因为那样就不太需要了。
这样做的结果是,窗口的横向宽度足够大,但纵向宽度不一定(需要手动调整)。
有两个小提示:
- 如果内容的宽度发生变化,你需要重新设置一次。
- 纵向滚动条会和内容小部件重叠在一起。如果你不想这样,可以把纵向滚动条的宽度加到滚动区域的最小宽度里。