代码之家  ›  专栏  ›  技术社区  ›  Phillip M. Feldman

如何防止QComboBox显示不必要的滚动条

  •  0
  • Phillip M. Feldman  · 技术社区  · 4 年前

    下面的代码基于zetcode的一个示例。com,创建一个组合框。生成的对话框有几个问题,但以下问题尤其令人恼火:

    1. PyQt为组合框显示一个垂直滚动条,尽管在没有滚动条的情况下,有足够的空间显示整个选项列表。

    2. 我试图将组合框移动到窗口左上角附近的位置,但这不起作用。

    #!/usr/bin/python
    
    import sys
    
    from PyQt5.QtWidgets import QWidget, QLabel, QHBoxLayout, QComboBox, QApplication
    
    class Example(QWidget):
    
        def __init__(self):
            super().__init__()
    
            self.setFixedWidth(400)
            self.setFixedHeight(500)
    
            self.initUI()
    
        def initUI(self):
    
            hbox = QHBoxLayout()
    
            self.lbl = QLabel('Animals', self)
            self.lbl.setStyleSheet('font-size:11pt')
    
            combo = QComboBox(self)
            combo.addItem('bear')
            combo.addItem('cat')
            combo.addItem('dog')
            combo.addItem('dolphin')
            combo.addItem('elephant')
            combo.addItem('fish')
            combo.addItem('frog')
            combo.addItem('horse')
            combo.addItem('rabbit')
            combo.addItem('rat')
            combo.addItem('shark')
            combo.addItem('snake')
            combo.addItem('tiger')
            combo.addItem('whale')
    
            combo.activated[str].connect(self.onActivated)
    
            hbox.addWidget(combo)
            hbox.setSpacing(20)
    
            hbox.addWidget(self.lbl)
            self.setContentsMargins(20, 20, 20, 20)
            self.setLayout(hbox)
    
            combo.move(20, 60)
            self.setWindowTitle('QComboBox')
            self.show()
    
        def onActivated(self, text):
    
            self.lbl.setText(text)
            self.lbl.adjustSize()
    
    
    def main():
    
        app = QApplication(sys.argv)
        ex = Example()
        sys.exit(app.exec_())
    
    
    if __name__ == '__main__':
        main()
    
    0 回复  |  直到 4 年前
        1
  •  1
  •   musicamante    4 年前

    这个问题有两个错误的假设。

    1. QComboBox的列表是 弹出窗口 小部件,它不关心(也不应该)关于组合框可用的空间:考虑它就像一个弹出的上下文菜单一样。 结束 窗口,如果需要更多空间,可能会超出其边界(这只是因为这些边界对菜单没有意义);
    2. 该组合已添加到布局管理器中,该管理器负责调整其大小和位置( 管理 )子部件,这就是为什么不能手动“移动”它们:布局已经在每次调整部件大小时自动设置几何图形(第一次显示时也会发生),因此任何尝试使用 move() , resize() setGeometry() 完全没有用;

    向布局中添加小部件时,默认行为是使其占据尽可能多的空间;由于QComboBox是具有固定大小的小部件之一,其结果是它实际上位于布局“分配”给它的空间的中心(垂直和水平),在您的情况下,这是显而易见的,因为您为容器小部件设置了一个固定大小,该大小远远大于其内容所需的大小。

    有两种方法可以在顶部对齐这些小部件:

    • 添加 alignment 争论 addWidget :
          hbox.addWidget(combo, alignment=QtCore.Qt.AlignTop)
          hbox.addWidget(self.lbl, alignment=QtCore.Qt.AlignTop)
      
      请注意,在您的情况下,这不会给您带来好的结果,因为标签和组合框的高度不同,所以标签可能看起来比组合框“更高”;
    • 使用QVBoxLayout布局作为小部件的主布局,向其添加水平布局,然后添加 伸展 之后(a) 伸展 在盒子布局上有一个“间隔物”,它试图占据尽可能多的空间)
          # ...
          mainLayout = QVBoxLayout()
          mainLayout.addLayout(hbox)
          mainLayout.addStretch()
          self.setLayout(mainLayout)
      

    PS:如果需要向QComboBox添加大量(仅限字符串)元素,请使用 addItems() 而不是逐个添加它们。