拉伸QListBoxWidget

时间:2013-03-27 18:15:24

标签: qt pyside stretch qlistwidget

问题

如何创建一个具有最小高度但延伸以填充所有可用空间的QListWidget,即使布局已经有拉伸组件?

背景

我使用PySide创建动态用户界面。接口的组件根据上下文而变化。我的目标是建立一个垂直布局:

控件(带标签的网格布局)
伸展
按钮(主操作按钮)
状态条

按钮和状态栏只是QHBoxLayouts。我使用的是QDialog而不是QMainWindow,因为这通常是在Maya或Nuke等其他应用程序中使用的。该对话框是即时构建的,有时可以在显示对话框后添加QListWidget。我无法预测何时加入Strest,何时不能预测。

试验

我尝试过使用其中一些代码无效:

# Set the size Policy.
listWidget.setSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding)

# Set a minimum Height
count = min(listBox.count(),12)
bestHeight = count*listBox.sizeHintForRow(0)+5
listBox.setMinimumHeight(bestHeight)

setMinimumHeight()以及setSizeHint(),我甚至尝试过继承QListWidget来控制sizeHint函数。 * How to set minimum height of QListWidgetItem? * QListWidget adjust size to content

实施例

这是一个完整的例子。 QListWidget没有伸展以填充高度。如果我删除addStretch()行,QListWidget会像我一样表现,但我真的希望它是动态的。

#!/usr/bin/env python
import sys
from PySide import QtCore, QtGui

class myDialog(QtGui.QDialog):
    def __init__(self, parent=None):
        QtGui.QDialog.__init__(self, parent)
        self.setWindowTitle("Testing 123")

        # Declare Layouts.
        self.mainLayout=QtGui.QVBoxLayout()
        self.gridLayout=QtGui.QGridLayout()
        self.buttons = QtGui.QHBoxLayout()
        self.statusBarLayout = QtGui.QHBoxLayout()

        # Set margins.
        self.mainLayout.setContentsMargins(0, 0, 0, 0)
        self.gridLayout.setContentsMargins(4, 4, 4, 4)
        self.buttons.setContentsMargins(0, 0, 0, 0)
        self.statusBarLayout.setContentsMargins(0, 0, 0, 0)

        # Assemble Layouts.
        self.mainLayout.addLayout(self.gridLayout)
        self.mainLayout.addStretch()
        self.mainLayout.addLayout(self.buttons)
        self.mainLayout.addLayout(self.statusBarLayout)

        self.setLayout(self.mainLayout)

        # Fill in Grid Layout.
        row = 0
        self.gridLayout.addWidget(QtGui.QLabel("ComboBox"), row, 0)
        combo = QtGui.QComboBox()
        combo.addItems(['A','B','C','1','2','3'])
        self.gridLayout.addWidget(combo, row, 1)
        row += 1

        self.gridLayout.addWidget(QtGui.QLabel("List"), row, 0)
        listWidget = QtGui.QListWidget()
        listWidget.addItems(['A','B','C','1','2','3'])
        self.gridLayout.addWidget(listWidget, row, 1)
        row += 1

        self.gridLayout.addWidget(QtGui.QLabel("LineEdit"), row, 0)
        self.gridLayout.addWidget(QtGui.QLineEdit(), row, 1)
        row += 1

        # Add some buttons.
        for x in ['One','Two']:
            self.buttons.addWidget(QtGui.QPushButton(x))

        # Add the psuedo status bar.
        self.statusBar = QtGui.QStatusBar()
        self.statusBarLayout.addWidget(self.statusBar, 4 )

        self.statusBar.showMessage("Hello World")

if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    dialog = myDialog()
    sys.exit(dialog.exec_())

2 个答案:

答案 0 :(得分:1)

我已经弄清楚了。当我将它添加到mainLayout时,我需要增加gridLayout的伸展因子。它与QListWidget无关。

这是它的缺点:

self.mainLayout.addLayout(self.gridLayout, 1) # stretch factor > 0
self.mainLayout.addStretch(0) # Default is 0

答案 1 :(得分:1)

如果您知道spacer的索引使用takeAt ( int index )方法将其删除,或者使用QSpacerItem代替,例如:

self.spacerItem = QtGui.QSpacerItem(
    20, 40,
    QtGui.QSizePolicy.Minimum,
    QtGui.QSizePolicy.Expanding
)
self.layout.addItem(self.spacerItem)

然后使用removeItem ( QLayoutItem * item )删除它:

self.layout.removeItem(self.spacerItem)