使滚动区域水平扩展以适应内容

2024-05-06 14:31:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我想让这个对话框水平展开以显示所有图像。我不希望它垂直扩展,因为会有一个滚动条。被注释掉的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_())

Tags: selfsizepngmainsyscolsprow
1条回答
网友
1楼 · 发布于 2024-05-06 14:31:10

您只需将滚动区域的最小宽度设置为内容的宽度。这样滚动区域将首先显示内容小部件的水平宽度。在

下面是我的示例(PySide,python3):

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

两点意见:

  • 如果内容改变宽度,你必须再做一次。在
  • 垂直滚动条将位于内容小部件内部(重叠)。如果您不想这样做,请将垂直滚动条的宽度添加到滚动区域的最小宽度。在

相关问题 更多 >