【问题标题】:PyQt5 equivalent to a WPF StackPanelPyQt5 相当于 WPF StackPanel
【发布时间】:2019-06-07 13:06:38
【问题描述】:

我正在使用 PyQt5 并希望将一些控件堆叠在一起。我希望这些控件能够根据它们的内容确定它们自己的大小。例如,如果我有三个按钮,内容分别为“一”、“二二”和“三三三”,那么第一个按钮应该是最小的,在左上角,第二个应该在第一个下方,并且稍宽,等等。值得一提的是,这些将被放置在QScrollArea 中,您可以期待数百个堆叠的项目。

我尝试了QVBoxLayout,但所有按钮都具有相同的大小,在屏幕上伸展,如果不足以填满父级,则会在中间浮动。

【问题讨论】:

    标签: python layout pyqt pyqt5


    【解决方案1】:

    您可以在QVboxLayout 中设置小部件的对齐方式,以阻止它们拉伸以适应宽度。您还可以在布局的末尾添加一个可拉伸的间隔,以阻止小部件垂直间隔。

    当放在滚动区域内时,它将如下所示:

    这是一个简单的演示:

    import sys
    from PyQt5 import QtCore, QtWidgets
    
    class Window(QtWidgets.QWidget):
        def __init__(self):
            super(Window, self).__init__()
            scroll = QtWidgets.QScrollArea()
            widget = QtWidgets.QWidget(scroll)
            vbox = QtWidgets.QVBoxLayout(widget)
            for index in range(5):
                for text in 'One', 'Two Two', 'Three Three Three':
                    button = QtWidgets.QToolButton()
                    button.setText('%s %s' % (text, index))
                    vbox.addWidget(button, 0, QtCore.Qt.AlignLeft)
            vbox.addStretch()
            scroll.setWidget(widget)
            layout = QtWidgets.QVBoxLayout(self)
            layout.addWidget(scroll)
    
    if __name__ == '__main__':
    
        app = QtWidgets.QApplication(sys.argv)
        window = Window()
        window.setGeometry(600, 100, 300, 300)
        window.show()
        sys.exit(app.exec_())
    

    【讨论】:

      【解决方案2】:

      试试看:

      import sys
      from PyQt5 import QtCore, QtGui, QtWidgets
      
      class MyWin(QtWidgets.QWidget):
          def __init__(self, nameButton, parent=None):                        
              super().__init__()
      
              self.lay = QtWidgets.QGridLayout(self)
              self.lay.setContentsMargins(10, 10, 10, 10)
      
              for ind, itm in enumerate(nameButton):
                  text = "{} {}".format(itm, itm*ind)
                  self.button = QtWidgets.QPushButton(text)
                  self.button.setFixedWidth(
                      QtGui.QFontMetrics(self.button.font()).width(self.button.text()+"___"))
                  self.button.clicked.connect(self.onButton)
                  self.lay.addWidget(self.button, ind, 0, QtCore.Qt.AlignLeft | QtCore.Qt.AlignTop)
      
              self.lay.setRowStretch(ind+1, 1)
      
          def onButton(self):
              print(self.sender().text())
      
      
      nameButton = [' one', ' two ', ' three ']
      
      if __name__=="__main__":
          app = QtWidgets.QApplication(sys.argv)
          myapp = MyWin(nameButton)                                         
          myapp.show()
          sys.exit(app.exec_())
      

      【讨论】:

      • 虽然这是一个有趣的解决方案,但出于多种原因,我宁愿不通过测量内部字形的宽度来设置按钮的宽度。
      猜你喜欢
      • 2012-11-12
      • 2010-10-25
      • 1970-01-01
      • 2016-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-16
      • 1970-01-01
      相关资源
      最近更新 更多