Python + Qt, проблема с QScrollArea:что не так с этим кодом?
Вопрос
У меня есть следующий код:
#!/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, но, похоже, это ни на что не влияет.Область, которая должна содержать мою панель, остается пустой!
Решение
Добавьте панель в область прокрутки после вы добавили все содержимое сетки.В частности, вам нужно позвонить QScrollArea.setWidget
после того, как у вас есть законченное создание виджет, который вы добавляете.
Я не знаю точно, почему это проблема, но я знаю, что я склонен инициализировать виджеты "снизу вверх".:Я заканчиваю добавлять все содержимое вложенного макета еще до того, как добавлю его в родительский макет.Я считаю, что это Qt, оптимизирующий порядок рендеринга, но я могу ошибаться на этот счет.
Приведенный ниже код представляет собой исправление, в основном для того, чтобы вы могли видеть, где произошло однострочное изменение.
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)
Другие советы
Недавно я боролся с тем же самым, и я считаю, что нашел решение, которое вы ищете.
Проблема, по-видимому, заключается в том, что когда вы добавляете пустой виджет в область прокрутки, он имеет размеры ноль на ноль (поскольку внутри него ничего нет).
Причина, по которой он не становится больше, заключается в том, что существует флаг, называемый widgetResizable
это False
по умолчанию.
Просто позвонив setWidgetResizable(True)
в области прокрутки виджет становится больше по мере добавления новых элементов.
Я надеюсь, что это поможет.