qt - ¿Cómo puedo cambiar el tamaño del contenido de un QScrollArea a medida que se colocan más widgets dentro?
pyside (3)
¿Por qué no usa un QListView para sus filas, ya que administrará todos los problemas por usted? Solo asegúrese de que después de agregarlo, haga clic en la Clase (ventana superior derecha del diseñador) y asigne un diseño o no se expandirá correctamente.
Uso un QLIstWidget dentro de un QScrollArea para hacer una lista de imágenes desplazable
Intenta esto para agregar otros objetos a la lista, así es como agrego una imagen a la lista.
QImage& qim = myclass.getQTImage();
QImage iconImage = copyImageToSquareRegion(qim, ui->display_image->palette().color(QWidget::backgroundRole()));
QListWidgetItem* pItem = new QListWidgetItem(QIcon(QPixmap::fromImage(iconImage)), NULL);
pItem->setData(Qt::UserRole, "thumb" + QString::number(ui->ImageThumbList->count())); // probably not necessary for you
QString strTooltip = "a tooltip"
pItem->setToolTip(strTooltip);
ui->ImageThumbList->addItem(pItem);
Tengo un widget QScrollArea , que comienza vacío;
Tiene un diseño vertical, con un QGridLayout y un espaciador vertical para mantenerlo en la parte superior y evitar que se extienda por toda el área de desplazamiento;
En otra parte del programa, hay un QTextEdit, que cuando se modifica, se analiza su contenido en busca de elementos de "especies", y luego se agregan a QGridLayout. También se eliminan los elementos de especies que se han eliminado. Este bit funciona;
He girado la barra de desplazamiento vertical todo el tiempo, de modo que cuando aparece no se sienta encima de las otras cosas allí. Sin embargo, tenga en cuenta que la barra de desplazamiento es más grande que el cuadro de desplazamiento, a pesar de no tener que serlo.
Este es el problema. El área de desplazamiento parece estar preestablecida, y no puedo cambiarla. Si agrego más filas a QGridLayout, el área de desplazamiento no aumenta de tamaño.
En cambio, se mantiene del mismo tamaño y aprieta el QGridLayout, haciéndolo lucir feo (al principio);
Y luego, después de agregar aún más, se vuelve inutilizable;
Tenga en cuenta que, una vez más, la barra de desplazamiento sigue siendo del mismo tamaño que en las imágenes anteriores. Las dos primeras imágenes son de Qt Designer, las siguientes 3 son del programa en ejecución.
Si cambio el tamaño de la ventana para que crezca QScrollArea, entonces veo esto:
Indica que hay algún diseño dentro del área de desplazamiento que no está cambiando de tamaño correctamente.
Mi pregunta es; ¿Qué debo hacer para que el área desplazable del widget cambie de tamaño dinámicamente a medida que agrego y elimino de QGridLayout?
La documentation proporciona una respuesta:
widgetResizable: bool
Esta propiedad mantiene si el área de desplazamiento debe cambiar el tamaño del widget de vista. Si esta propiedad se establece en falso (el valor predeterminado), el área de desplazamiento respeta el tamaño de su widget.
Establézcalo en verdadero.
Si vienes desde Google y no tienes suerte con la respuesta aceptada, es porque te estás perdiendo la otra invocación secreta: QScrollArea::setWidget
. Debe crear e identificar explícitamente un único widget que se va a desplazar. ¡No es suficiente simplemente agregar el artículo como un niño! Agregar varios elementos directamente a ScrollArea
tampoco funcionará.
Esta secuencia de comandos muestra un ejemplo de trabajo simple de QScrollArea:
from PySide.QtGui import *
app = QApplication([])
scroll = QScrollArea()
scroll.setWidgetResizable(True) # CRITICAL
inner = QFrame(scroll)
inner.setLayout(QVBoxLayout())
scroll.setWidget(inner) # CRITICAL
for i in range(40):
b = QPushButton(inner)
b.setText(str(i))
inner.layout().addWidget(b)
scroll.show()
app.exec_()