Pregunta

Sé que esta es una pregunta muy específica relacionada con C ++ y Qt, pero tal vez alguien pueda ayudarme, de todos modos ...

Vea el código a continuación: Quiero mostrar una imagen dentro de un área de desplazamiento. El puerto de vista del área de desplazamiento tendrá un tamaño inicial definido. Eso significa que, si el tamaño de la imagen es mayor que el tamaño inicial del puerto de visualización, las barras de desplazamiento serán visibles, de lo contrario no.

// create label for displaying an image
QImage image( ":/test.png" );
QLabel *label = new QLabel( this );
label->setPixmap( image.toPixmap() );

// put label into scroll area
QScollArea *area = new QScrollArea( this );
area->setWidget( label );

// set the initial size of the view port
// NOTE: This is what I'd like to do, but this method does not exist :(
area->setViewPortSize( QSize( 300, 300 ) );

Será posible cambiar el tamaño de toda la aplicación para que el puerto de visualización obtenga otro tamaño que el inicial.

Desafortunadamente no pude averiguar cómo establecer el tamaño del puerto de vista. El mecanismo de diseño de Qt parece establecer un tamaño predeterminado para el puerto de visualización, pero hasta ahora no he podido cambiarlo. Configurar un nuevo tamaño con

area->setMinimumSize( QSize( 300, 300 ) );

realmente establecerá el tamaño requerido, pero luego el área de desplazamiento pierde la capacidad de cambiar el tamaño a un tamaño menor a 300x300.

¿Alguna idea?

¿Fue útil?

Solución

Creo que estás viendo el problema de manera incorrecta. QScrollArea es solo un widget que colocas en un marco o QMainWindow. El tamaño del widget está controlado por el diseño del widget que lo contiene.

Eche un vistazo a este ejemplo de Trolltech: Visor de imágenes Ejemplo

Otros consejos

¿El área de desplazamiento es el widget de nivel superior? Si es así, simplemente llame

area->resize(300,300);

Si está dentro de una jerarquía, necesita cambiar el tamaño del nivel superior de forma apropiada (complejo) o establecer el tamaño mínimo del área. También puede intentar experimentar con LayoutPolicy: asumiendo que sizeHint es QSize (300,300), puede darle la política de tamaño adecuada de acuerdo con lo que se define en https://doc.qt.io/qt-5/qsizepolicy.html#Policy-enum

Puedes probar:

class MyScrollArea : public QScrollArea
{
    virtual QSize sizeHint() const { return QSize( 300, 300 ); }
};

// create label for displaying an image
QImage image( ":/test.png" );
Label *label = new QLabel;
label->setPixmap( image.toPixmap() );

// put label into scroll area
QScollArea *area = new MyScrollArea( this );
area->setWidget( label );

Sin embargo, el diseño y Qt es sorprendentemente Voodoo. Es IMO su parte menos funcional.

si eso no funciona, intente llamar a QWidget :: resize () en varios widgets.

No creo que puedas hacer exactamente eso con mucha facilidad, que es (si estoy leyendo correctamente), dimensiona el widget para que el área interna sea 300x300. Sin embargo, es posible que pueda modificarla, ya que un área de desplazamiento es un tipo de marco, que se hereda de QWidget. Esto significa que simplemente puede llamar a area- > resize (300 + fudge, 300 + fudge) , donde sus valores de fudge representan el bit extra que ocupa el dibujo del marco.

Sin embargo, no estoy seguro de que esto funcione en un diálogo de tamaño variable dinámicamente. Nunca he hecho algo como esto.

Si está intentando mostrar una imagen dentro de un área de desplazamiento, su mejor apuesta no es ir con una etiqueta.

Debería intentar usar un QGraphicsView / QGraphicsScene / QGraphicPixmapItem (en lugar del área de desplazamiento y la etiqueta). El rendimiento es mucho mejor cuando se muestran imágenes. El área de desplazamiento y la etiqueta volverán a dibujar la imagen de manera muy deficiente a medida que se desplaza con las barras de desplazamiento.

Por ejemplo, tienes un " .ui " archivo con un QGraphicsView en la interfaz gráfica de usuario llamada " qgvImageView " y una QImage llamada " imagen " ...

QGraphicsScene *scene = new QGraphicsScene(qgvImageView);
QPixmap pixTmp(QPixmap::fromImage(image));
QGraphicsPixmapItem * ppixItem = scene->addPixmap( pixTmp );
ppixItem->setPos(0,0);

Echa un vistazo a la documentación QT. BTW: Esto fue introducido en Qt 4.2

No estoy seguro de si esto solucionará específicamente el problema, pero existe la posibilidad de que QGraphicsView reaccione mejor a lo que estás tratando de hacer.

¿Qué hay de usar

area->setGeometry(int x, int y, int w, int h);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top