Qt 弹性QListBoxWidget 问题:
我如何创建一个QListWidget,它有一个最小的高度,但即使布局已经有一个拉伸组件,也会拉伸以填充所有可用空间 背景 我正在使用PySide创建动态用户界面。接口的组件根据上下文而变化。我的目标是有这样一个垂直布局: 控件(带标签的网格布局)Qt 弹性QListBoxWidget 问题:,qt,pyside,stretch,qlistwidget,Qt,Pyside,Stretch,Qlistwidget,我如何创建一个QListWidget,它有一个最小的高度,但即使布局已经有一个拉伸组件,也会拉伸以填充所有可用空间 背景 我正在使用PySide创建动态用户界面。接口的组件根据上下文而变化。我的目标是有这样一个垂直布局: 控件(带标签的网格布局) 拉伸 按钮(主要操作按钮) 状态栏 按钮和状态栏只是QHBoxLayouts。我使用QDialog而不是QMainWindow,因为它通常在其他应用程序(如Maya或Nuke)中使用。对话框是动态构建的,有时在显示对话框后可以添加QListWidget
拉伸
按钮(主要操作按钮)
状态栏
按钮和状态栏只是QHBoxLayouts。我使用QDialog而不是QMainWindow,因为它通常在其他应用程序(如Maya或Nuke)中使用。对话框是动态构建的,有时在显示对话框后可以添加QListWidget。我无法预测什么时候该做伸展运动,什么时候不该做 审判 我尝试过使用这些代码中的一些,但都没有用:
# 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函数。
*
*
例子
这是一个完整的例子。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_())
我已经弄明白了。当我将gridLayout添加到mainLayout时,我需要增加它的拉伸系数。它与QListWidget无关 以下是它的短处:
self.mainLayout.addLayout(self.gridLayout, 1) # stretch factor > 0
self.mainLayout.addStretch(0) # Default is 0
如果您知道间隔符的索引,请使用该方法将其删除,或者使用
QSpacerItem
替代,例如:
self.spacerItem = QtGui.QSpacerItem(
20, 40,
QtGui.QSizePolicy.Minimum,
QtGui.QSizePolicy.Expanding
)
self.layout.addItem(self.spacerItem)
然后用以下方法将其移除:
为什么要添加拉伸?我的布局通常不包含QListWidget。当这种情况发生时,我希望拉伸保持按钮布局和状态栏布局被推到底部。如果可以在运行中添加和删除拉伸,这将解决我的问题。感谢您花时间回答。这会很有效的。正如我在解决方案中指出的那样。我没有正确创建布局。现在我设置了一个很好的拉伸因子,一切都很好。
self.layout.removeItem(self.spacerItem)