setcolumnstretch addwidget qt pyqt

qt - addwidget - ¿Cómo crear un QVBoxLayout desplazable?



qt5 qgridlayout (3)

Estoy tratando de poner un QVBoxLayout dentro de un QScrollArea para que se pueda desplazar verticalmente. Sin embargo, los artículos no parecen estar agregados.

Vi una sugerencia de que debería crear un widget interno que usa ScrollArea y colocar el diseño dentro de eso, aunque parece que no funcionó. Mi estructura se supone que debe verse así:

+------------------------------- | QScrollArea(realmScroll) | +---------------------------- | | QWidget(realmScrollInner) | | +------------------------- | | | QVBoxLayout(realmLayout)

Y el código para hacer esto:

# Irrelevant, added for context (this works) centralWidget = QWidget(self) self.container = QVBoxLayout(centralWidget) centralWidget.setLayout(self.container) self.setCentralWidget(centralWidget) # Where trouble starts self.realmScroll = QScrollArea(self.container.widget()) self.realmScroll.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded) self.realmLayout = QVBoxLayout(self.container.widget()) self.realmScrollInner = QWidget(self.realmScroll) self.realmScrollInner.setLayout(self.realmLayout) self.realmScroll.setWidget(self.realmScrollInner) self.container.addWidget(self.realmScroll) # Doesn''t add to realmLayout self.realmLayout.addWidget(QLabel("test"))

Todavía estoy aprendiendo Qt (2 días), así que las respuestas en profundidad a donde me estoy equivocando serán apreciadas.

Actualización :

Parece que el addWidget(QLabel()) funciona hasta que el realmScrollInner se haya configurado como el widget de realmScroll . Como me gustaría añadir elementos después de que se haya visualizado la IU, tengo que hacer esto, lo que no estoy seguro es realmente correcto:

self.realmLayout.addWidget(QLabel("test")) # realmScrollInner bound to realmScroll realmScroll.setWidget(realmScrollInner) self.container.addWidget(realmScroll) # Access realmScroll''s widget and then layout to add realmScroll.widget().layout().addWidget(QLabel("test"))

Pero si elimina esa primera llamada a addWidget antes de que se haya enlazado el widget (para que el diseño no tenga widgets), a continuación, no se mostrarán los widgets ScrollArea añadidos posteriormente. Quizás el ScrollArea necesita repintar (aunque no veo un método para eso)?

Actualización 2 : Llamar a repaint() en realmScroll o su widget contenido no hace nada, al igual que llamar a activate/update() en el diseño.


Intenta llamar

self.realmScroll.setWidgetResizable(True)


OK, acabo de terminar de pelear con esto. Aquí hay un widget que puede entrar en un área de desplazamiento (scrollarea-> setWidget) y funcionar correctamente. Contiene un QVBoxLayout y una lista de pares label / listwidget, cada uno en su propio diseño horizontal pequeño, y hace más o menos lo que te gustaría.

Lo importante fue leer la sección de documentos de QScrollArea sobre sugerencias de tamaño y diseños, y encontrar el bit donde sería necesario tener sizeContraint QLayout :: SetMinAndMaxSize en el diseño.

class MappingDisplayWidget : public QWidget { Q_OBJECT public: explicit MappingDisplayWidget(QWidget *parent = 0); void addFile(QString name); private: QVBoxLayout *m_layout; QMap<QString, QListWidget *> m_mappings; }; MappingDisplayWidget::MappingDisplayWidget(QWidget *parent) : QWidget(parent) { m_layout = new QVBoxLayout; m_layout->setSizeConstraint(QLayout::SetMinAndMaxSize); setLayout(m_layout); } void MappingDisplayWidget::addFile(QString name) { if (m_mappings.find(name) == m_mappings.end()) { QWidget *widg = new QWidget; QHBoxLayout *lay = new QHBoxLayout; widg->setLayout(lay); QLabel *nlab = new QLabel(name); lay->addWidget(nlab); QListWidget *list = new QListWidget; lay->addWidget(list); m_layout->addWidget(widg); m_mappings[name] = list; } }

Mantengo los punteros a los widgets de la lista para que pueda agregarles cosas más tarde, y eso funciona bien.


Resultó que me llevaron por un camino equivocado al poner el diseño como el diseño de un widget. La forma real de hacerlo es tan simple como:

scrollarea = QScrollArea(parent.widget()) layout = QVBoxLayout(scrollarea) realmScroll.setWidget(layout.widget()) layout.addWidget(QLabel("Test"))

Lo cual estoy bastante seguro de haber intentado originalmente, pero bueno, está funcionando.

Sin embargo, esto agrega un problema de que los elementos del diseño se reducen verticalmente en lugar de provocar que el área de visualización agregue una barra de desplazamiento.