1

次のコードがあります。


#!/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 に追加しようとしましたが、何の影響もないようです。私のペインを含むはずの領域は空のままです!

4

2 に答える 2

3

グリッドのコンテンツをすべて追加したら、ペインをスクロール領域に追加します。特に、追加するウィジェットの作成QScrollArea.setWidgetが完了した後に呼び出す必要があります。

なぜこれが問題なのか正確にはわかりませんが、私はウィジェットを「ボトムアップ」で初期化する傾向があることを知っています: 親レイアウトに追加する前に、サブレイアウトのすべてのコンテンツを追加し終えます。これはレンダリングの順序を最適化する Qt だと思いますが、それについては間違っている可能性があります。

以下のコードはパッチです。ほとんどの場合、1 行の変更箇所を確認できます。

    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)
于 2009-12-04T19:33:22.947 に答える
2

私は最近同じことに苦労しており、あなたが探している解決策を見つけたと思います.

問題は、空のウィジェットをスクロール領域に追加すると、そのサイズが 0 x 0 になることです (その中に何もないため)。

大きくならない理由widgetResizableFalse、デフォルトで呼び出されるフラグがあるためです。

スクロール領域を呼び出すだけsetWidgetResizable(True)で、新しいアイテムが追加されるにつれてウィジェットが大きくなります。

これが役立つことを願っています。

于 2012-08-24T17:12:37.063 に答える