代码之家  ›  专栏  ›  技术社区  ›  kne

设置QScrollara的最小合理宽度

  •  2
  • kne  · 技术社区  · 7 年前

    我对Qt比较陌生,我通过PySide访问Qt。

    我有一个很长的内容列表,我想使垂直滚动。 QScrollArea 为此。下面是一个简单的示例:

    import sys
    
    import PySide.QtGui as gui
    
    application = gui.QApplication(sys.argv)
    
    window = gui.QScrollArea()
    list = gui.QWidget()
    layout = gui.QVBoxLayout(list)
    
    for i in range(100):
        layout.addWidget(gui.QLabel(
            "A something longish, slightly convoluted example text."))
    
    window.setWidget(list)
    
    window.show()
    
    sys.exit(application.exec_())
    

    发生了什么:

    1. 滚动区域将其水平大小设置为标签所需的大小

    2. 它注意到垂直空间不足,因此添加了一个垂直滚动条。

    3. 由于垂直滚动条,水平空间现在也不足,因此也显示了水平滚动条。

    我可以使水平滚动条消失 setHorizontalScrollBarPolicy ,但主要问题仍然存在:垂直滚动条遮挡了部分标签。

    如何将滚动区域的宽度设置为不需要水平滚动条的最小值?

    2 回复  |  直到 7 年前
        1
  •  3
  •   ekhumoro    7 年前

    为了确保滚动区域的大小正确,必须根据其内容为其设置最小宽度,并允许垂直滚动条和框架。也可能最好设置 widgetResizable 属性到 True 并在内容布局的末尾添加一个可扩展的间隔。

    在下面的示例中,我更改了标签的背景颜色,以便更容易看到正在发生的事情。我还允许通过在显示后重置最小宽度来调整窗口大小,使其小于初始大小,但这是可选的。

    import sys
    
    import PySide.QtGui as gui
    
    application = gui.QApplication(sys.argv)
    
    window = gui.QScrollArea()
    window.setWidgetResizable(True)
    list = gui.QWidget()
    layout = gui.QVBoxLayout(list)
    
    # just for testing
    window.setStyleSheet('QLabel {background-color: red}')
    
    for i in range(30):
        layout.addWidget(gui.QLabel(
            "A something longish, slightly convoluted example text."))
    
    layout.addStretch()
    
    window.setWidget(list)
    
    window.setMinimumWidth(
        list.sizeHint().width() +
        2 * window.frameWidth() +
        window.verticalScrollBar().sizeHint().width())
    
    window.show()
    
    # allow resizing smaller
    window.setMinimumWidth(1)
    
    sys.exit(application.exec_())
    
        2
  •  0
  •   draentropia    7 年前

    尝试在小部件中使用sizeHint(),并使用结果设置QScrollArea的最小宽度。

    这里有一些额外信息: http://doc.qt.io/qt-5/layout.html