蟒蛇+ Qt的,QScrollArea问题:什么是错用此代码?
题
我有以下代码:
#!/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,但似乎并没有影响到任何东西。这是应该包含我的窗格的区域保持空!
解决方案
窗格添加到滚动区域的之后的添加完所有网格的内容。特别是你需要调用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)
其他提示
我最近一直在努力与同样的事情,我相信我已经找到你正在寻找的解决方案。
这个问题似乎是,当你添加一个空的小部件的滚动区域,它由零具有零尺寸(因为在它的内部没有)。
它之所以没有得到大是因为有一种叫做的 widgetResizable
由默认False
。
通过简单地滚动区域呼叫setWidgetResizable(True)
,小部件得到在添加新项目更大。
我希望这有助于。
不隶属于 StackOverflow