Python + Qt,QScrollArea问题:这段代码出了什么问题?

时间:2009-12-04 17:44:29

标签: python qt pyqt4

我有以下代码:


#!/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添加大小策略,但它似乎不会影响任何内容。应该包含我的窗格的区域保持空白!

2 个答案:

答案 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),随着新项目的添加,窗口小部件就会变大。

我希望这会有所帮助。