我有以下代码:
#!/usr/bin/env python
import sys
from PyQt4 import QtGui, QtCore
class SimfilePanel(QtGui.QWidget):
'''This class provides the simfile panel shown on the right side of the main window.'''
def __init__(self, parent=None):
'''Load song info here.'''
QtGui.QWidget.__init__(self, parent)
## Make widgets.
# Pane with simfile information.
simfileInfoPane = QtGui.QWidget()
simfileInfoPane.setSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding)
simfileInfoGrid = QtGui.QGridLayout()
simfileInfoPane.setLayout(simfileInfoGrid)
simfileInfoScrollArea = QtGui.QScrollArea()
simfileInfoScrollArea.setWidget(simfileInfoPane)
#if DEBUG: simfileInfoScrollArea.setBackgroundRole(QtGui.QPalette.Dark);
# This will change
labels = []
textfields = []
for i in range(0,20):
labels.append( QtGui.QLabel("Label "+str(i)) )
textfields.append( QtGui.QLineEdit() )
labels[i].setBuddy(textfields[i])
simfileInfoGrid.addWidget(labels[i], i, 0)
simfileInfoGrid.addWidget(textfields[i], i, 1)
## Put widgets in a grid layout.
mainvbox = QtGui.QVBoxLayout()
mainvbox.addWidget(simfileInfoScrollArea)
self.setLayout(mainvbox)
# Standalone testing
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
panel = SimfilePanel()
panel.show()
sys.exit(app.exec_())
我无法获得任何我要放入simfileInfoGrid中显示的内容!如果我遗漏滚动区域,它们会显示,但我需要滚动区域,因为我将在最终版本中编辑很多字段,我不想在屏幕上拉伸整个窗口。
如您所见,我已尝试向simfileInfoPane添加大小策略,但它似乎不会影响任何内容。应该包含我的窗格的区域保持空白!
答案 0 :(得分:3)
在添加了所有网格内容之后,将窗格添加到滚动区域。特别是在完成您添加的小部件后,您需要致电QScrollArea.setWidget
。
我不确切知道为什么会出现这个问题,但我知道我倾向于“自下而上”初始化小部件:在我将其添加到父级之前,我完成了添加子布局的所有内容布局。我相信这是Qt优化渲染的顺序,但我可能错了。
下面的代码是一个补丁,主要是因为你可以看到单行更改的位置。
diff -u 1848547.py tmp2.py
--- 1848547.py 2009-12-04 11:19:09.000000000 -0800
+++ tmp2.py 2009-12-04 11:34:58.000000000 -0800
@@ -19,7 +19,6 @@
simfileInfoPane.setLayout(simfileInfoGrid)
simfileInfoScrollArea = QtGui.QScrollArea()
- simfileInfoScrollArea.setWidget(simfileInfoPane)
#if DEBUG:
simfileInfoScrollArea.setBackgroundRole(QtGui.QPalette.Dark)
@@ -33,6 +32,8 @@
simfileInfoGrid.addWidget(labels[i], i, 0)
simfileInfoGrid.addWidget(textfields[i], i, 1)
+ simfileInfoScrollArea.setWidget(simfileInfoPane)
+
## Put widgets in a grid layout.
mainvbox = QtGui.QVBoxLayout()
mainvbox.addWidget(simfileInfoScrollArea)
答案 1 :(得分:2)
我最近一直在努力做同样的事情,我相信我找到了你正在寻找的解决方案。
问题似乎是当你向滚动区域添加一个空小部件时,它的维度为零(因为它内部没有任何内容)。
它没有变大的原因是因为默认情况下有一个名为widgetResizable
的标志False
。
只需在滚动区域调用setWidgetResizable(True)
,随着新项目的添加,窗口小部件就会变大。
我希望这会有所帮助。