Python + Qt, проблема QScrollArea: что не так с этим кодом? - PullRequest
0 голосов
/ 04 декабря 2009

У меня есть следующий код:


#!/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 ]

3 голосов
/ 04 декабря 2009

Добавьте панель в область прокрутки после того, как вы добавили все содержимое сетки.В частности, вам нужно позвонить QScrollArea.setWidget после того, как вы закончили создание добавляемого вами виджета.

Я не знаю точно, почему это проблема, но я знаю, что склоненчтобы инициализировать виджеты «снизу вверх»: я заканчиваю добавлять все содержимое вложенного макета до того, как добавляю его в родительский макет.Я считаю, что это оптимизирующий порядок рендеринга Qt, но я могу ошибаться.

Приведенный ниже код представляет собой патч, в основном, так что вы можете увидеть, где находится однострочное изменение.

2 голосов
/ 24 августа 2012

Я недавно боролся с тем же, и я считаю, что нашел решение, которое вы ищете.

Проблема заключается в том, что при добавлении пустого виджета в область прокрутки он имеет размеры от нуля до нуля (поскольку внутри него ничего нет).

Причина, по которой он не увеличивается, заключается в том, что существует флаг с именем widgetResizable, который по умолчанию равен False.

Простым вызовом setWidgetResizable(True) в области прокрутки виджет увеличивается по мере добавления новых элементов.

Надеюсь, это поможет.

...