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

1 投票
2 回答
2101 浏览
提问于 2025-04-15 16:42

我有以下代码:


#!/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 个回答

2

我最近也遇到了同样的问题,觉得我找到了你想要的解决办法。

问题在于,当你往滚动区域里添加一个空的组件时,它的大小是零乘零(因为里面什么都没有)。

它不会变大的原因是有一个叫做 widgetResizable 的标志,默认是 False

只需要在滚动区域上调用 setWidgetResizable(True),这样当你添加新项目时,组件就会变大。

希望这能帮到你。

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)

撰写回答