<p>实际上,它确实有效。问题是,<code>Test</code>小部件有一个没有任何布局管理的<code>QPushButton</code>。所以它不能计算它的<code>minimumSize</code>与考虑的按钮。当你把这个小部件放在一个布局中时,它只是缩小到<code>0</code>(因为<code>QWidget</code>没有默认的<code>minimumSize</code>),你看不到任何东西。</p>
<p>您有两个选择,要么手动管理布局并进入一个不必要的痛苦世界,要么依赖于布局管理器。一般来说,你应该更喜欢后者。</p>
<p>我会像这样重新编写你的脚本(虽然我不确定你为什么要使用<code>QFormLayout</code>,但我还是保持原样):</p>
<pre><code>from PyQt4 import QtGui, QtCore
import sys
class Main(QtGui.QMainWindow):
def __init__(self, parent = None):
super(Main, self).__init__(parent)
# main button
self.addButton = QtGui.QPushButton('button to add other widgets')
self.addButton.clicked.connect(self.addWidget)
# scroll area widget contents - layout
self.scrollLayout = QtGui.QFormLayout()
# scroll area widget contents
self.scrollWidget = QtGui.QWidget()
self.scrollWidget.setLayout(self.scrollLayout)
# scroll area
self.scrollArea = QtGui.QScrollArea()
self.scrollArea.setWidgetResizable(True)
self.scrollArea.setWidget(self.scrollWidget)
# main layout
self.mainLayout = QtGui.QVBoxLayout()
# add all main to the main vLayout
self.mainLayout.addWidget(self.addButton)
self.mainLayout.addWidget(self.scrollArea)
# central widget
self.centralWidget = QtGui.QWidget()
self.centralWidget.setLayout(self.mainLayout)
# set central widget
self.setCentralWidget(self.centralWidget)
def addWidget(self):
self.scrollLayout.addRow(Test())
class Test(QtGui.QWidget):
def __init__( self, parent=None):
super(Test, self).__init__(parent)
self.pushButton = QtGui.QPushButton('I am in Test widget')
layout = QtGui.QHBoxLayout()
layout.addWidget(self.pushButton)
self.setLayout(layout)
app = QtGui.QApplication(sys.argv)
myWidget = Main()
myWidget.show()
app.exec_()
</code></pre>