Python + Qt, QScrollArea problema: che cosa c'è di sbagliato con questo codice?

StackOverflow https://stackoverflow.com/questions/1848547

  •  13-09-2019
  •  | 
  •  

Domanda

Ho il seguente codice:


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

Non riesco a ottenere tutto ciò che sto mettendo in simfileInfoGrid per visualizzare! Faranno mostrano se lascio fuori l'area di scorrimento, ma ho bisogno l'area di scorrimento, come avrò un sacco di campi per modificare nella versione finale e non voglio allungare l'intera finestra sullo schermo.

Come potete vedere ho cercato di aggiungere una politica di dimensione per simfileInfoPane, ma non sembra interessare nulla. L'area che dovrebbe contenere la mia riquadro rimane vuoto!

È stato utile?

Soluzione

Aggiungi il riquadro per l'area di scorrimento dopo che hai aggiunto tutti i contenuti della griglia. In particolare è necessario chiamare QScrollArea.setWidget dopo aver finito di creare il widget si aggiunge.

Non so esattamente perché questo è il problema, ma so che io tendo a inizializzare widget "bottom-up": ho finito di aggiungere tutti i contenuti di un sub-layout prima che io abbia mai aggiungerlo a un genitore disposizione. Credo che questo sia ordine ottimizzazione Qt di rendere, ma potrei sbagliarmi su questo.

Il codice qui sotto è una patch, per lo più in modo da poter vedere dove il cambiamento di una sola riga è.

    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)

Altri suggerimenti

Di recente ho lottato con la stessa cosa, e credo di aver trovato la soluzione che state cercando.

Il problema sembra essere che quando si aggiunge un widget vuoto per l'area di scorrimento, ha dimensioni pari a zero per zero (poiché non v'è nulla all'interno di esso).

Il motivo per cui non ottiene più grande è perché c'è un flag chiamato widgetResizable che è False per impostazione predefinita.

semplicemente chiamando setWidgetResizable(True) sulla zona di scorrimento, il widget diventa più grande man mano che vengono aggiunti nuovi elementi.

Spero che questo aiuta.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top