Question

Je le code suivant:


#!/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_())

Je ne peux pas tout ce que je suis en train dans le simfileInfoGrid pour afficher! Ils affichent si je quitte la zone de défilement, mais je dois la zone de défilement que je vais avoir beaucoup de champs à éditer dans la version finale et je ne veux pas étirer toute la fenêtre sur l'écran.

Comme vous le voyez, je l'ai essayé d'ajouter une politique de taille à simfileInfoPane, mais il ne semble pas affecter quoi que ce soit. La zone qui est censé contenir mon volet reste vide!

Était-ce utile?

La solution

Ajoutez le volet à la zone de défilement après que vous avez ajoutés tout le contenu de la grille. En particulier, vous devez appeler QScrollArea.setWidget après que vous ayez fini de créer le widget que vous ajoutez.

Je ne sais pas exactement pourquoi cela est le problème, mais je ne sais que je tends à initialiser des widgets « bottom-up »: Je fini d'ajouter tout le contenu d'un sous-layout avant d'ajouter jamais à un parent disposition. Je crois que c'est l'ordre d'optimisation Qt de rendu, mais je peux me tromper à ce sujet.

Le code ci-dessous est un patch, la plupart du temps de sorte que vous pouvez voir où le changement d'une ligne est.

    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)

Autres conseils

J'ai récemment été aux prises avec la même chose, et je crois avoir trouvé la solution que vous recherchez.

Le problème semble être que lorsque vous ajoutez un widget de vide à la zone de défilement, il a des dimensions de zéro par zéro (car il n'y a rien à l'intérieur de celui-ci).

La raison pour qu'il ne soit pas plus grand est parce qu'il ya un indicateur appelé widgetResizable est False par défaut.

En appelant simplement setWidgetResizable(True) sur la zone de défilement, le widget devient de plus que de nouveaux éléments sont ajoutés.

J'espère que cette aide.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top