Pergunta

Eu tenho o seguinte código:


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

Eu não posso conseguir qualquer coisa que eu estou colocando no simfileInfoGrid a exposição! Eles vão mostrar se eu deixar de fora da área de rolagem, mas eu preciso de área de rolagem como eu vou ter um monte de campos para editar na versão final e eu não quero esticar toda a janela sobre a tela.

Como você vê eu tentei adicionar uma política tamanho para simfileInfoPane, mas não parece afetar nada. A área que é suposto para conter minhas estadias painel vazio!

Foi útil?

Solução

Adicione o painel para a área de rolagem após que você adicionou todos os conteúdos da grade. Em particular, você precisa QScrollArea.setWidget chamada depois de ter criação acabado do widget você adicionar.

Eu não sei exatamente por isso que este é o problema, mas eu sei que eu tendo a inicializar os widgets "bottom-up": eu terminar de adicionar todos os conteúdos de uma sub-disposição antes de eu adicioná-lo a um pai layout. Creio que esta é Qt fim otimização da prestação, mas posso estar errado sobre isso.

O código abaixo é um patch, principalmente para que você possa ver onde a alteração de uma linha é.

    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)

Outras dicas

Eu recentemente estive lutando com a mesma coisa, e eu acredito que eu encontrei a solução que você está procurando.

O problema parece ser que quando você adicionar um widget vazio para a área de rolagem, que tem dimensões de zero zero (já que não há nada dentro dela).

A razão não ficar maior é porque há uma bandeira chamada widgetResizable isto é False por padrão.

Por simplesmente chamando setWidgetResizable(True) na área de rolagem, o widget se torna maior à medida que novos itens são adicionados.

Espero que isso ajude.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top