musica imagen electronica definicion image qt autoresize

definicion - imagen de electronica musica



Mostrar la imagen en Qt para ajustarse al tamaƱo de la etiqueta (4)

Ya probé varios métodos para mostrar una imagen en un formulario, pero ninguno de ellos funciona como me gustaría.

He leído muchos lugares que la manera más fácil es crear una etiqueta y usar eso para mostrar la imagen. Tengo una etiqueta, cuyo tamaño es especificado por el diseño, pero si cargo una imagen con un mapa de píxeles, la etiqueta cambia de tamaño al tamaño de la imagen. Si utilizo la etiqueta img como propiedad text o css background, no se mostrará toda la imagen. Lo que me gustaría hacer es cargar la imagen y ajustarla en la etiqueta, sin cambiar el tamaño de la etiqueta, pero cuando cambie el tamaño de mi ventana, y al cambiar el tamaño de la etiqueta también, la imagen debe cambiar de tamaño para que siempre se ajuste en ello.

Si el único método es obtener el tamaño de la etiqueta y cambiar el tamaño del mapa de píxeles para que encaje, y manejar el evento de cambio de tamaño (señal), ¿cómo podría cambiar el tamaño del mapa de píxeles? Espero no tener que guardar todo en una QImage y crear un mapa de píxel cada vez.

Además, ¿cómo puedo centrarlo? Si no puede adaptarse tanto al ancho como a la altura, me gustaría que la dimensión más pequeña se centre.

Ah, y no quiero usar controles deslizantes para manejar desbordamientos.



En realidad, hay una resolución muy simple para este problema. Hay dos cosas que debes modificar:

  1. establecer el contenido escalado en verdadero (mencionado anteriormente)
  2. establecer la política de tamaño de la etiqueta para ignorar

    QLabel lblImage; lblImage->setPixmap( QPixmap( "big_image.jpg" ) ); lblImage->setScaledContents( true ); lblImage->setSizePolicy( QSizePolicy::Ignored, QSizePolicy::Ignored );

Si lblImage cambia de tamaño automáticamente, la imagen se estirará al tamaño de la etiqueta.


Mantenga una copia de su pixmap original alrededor. Luego, conecte la señal resized a una ranura (o anule la función resizeEvent() ) que implementa esto:

lblImage->setPixmap(pixmap.scaled(lblImage->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation));


También responderé mi propia pregunta, pero no la señalaré como solución, porque solicité una simple que se mencionó anteriormente. Terminé usando una solución no demasiado simple después de todo, por lo que cualquiera que también necesite hacer algo similar y tenga tiempo para jugar con ella, este es mi código de trabajo final. La idea es expandir QLabel y sobrecargar los métodos setPixmap y drawEvent.

QPictureLabel.hpp (archivo de encabezado)

#include "QImage.h" #include "QPixmap.h" #include "QLabel.h" class QPictureLabel : public QLabel { private: QPixmap _qpSource; //preserve the original, so multiple resize events won''t break the quality QPixmap _qpCurrent; void _displayImage(); public: QPictureLabel(QWidget *aParent) : QLabel(aParent) { } void setPixmap(QPixmap aPicture); void paintEvent(QPaintEvent *aEvent); };

QPictureLabel.cpp (implementación)

#include "QPainter.h" #include "QPictureLabel.hpp" void QPictureLabel::paintEvent(QPaintEvent *aEvent) { QLabel::paintEvent(aEvent); _displayImage(); } void QPictureLabel::setPixmap(QPixmap aPicture) { _qpSource = _qpCurrent = aPicture; repaint(); } void QPictureLabel::_displayImage() { if (_qpSource.isNull()) //no image was set, don''t draw anything return; float cw = width(), ch = height(); float pw = _qpCurrent.width(), ph = _qpCurrent.height(); if (pw > cw && ph > ch && pw/cw > ph/ch || //both width and high are bigger, ratio at high is bigger or pw > cw && ph <= ch || //only the width is bigger or pw < cw && ph < ch && cw/pw < ch/ph //both width and height is smaller, ratio at width is smaller ) _qpCurrent = _qpSource.scaledToWidth(cw, Qt::TransformationMode::FastTransformation); else if (pw > cw && ph > ch && pw/cw <= ph/ch || //both width and high are bigger, ratio at width is bigger or ph > ch && pw <= cw || //only the height is bigger or pw < cw && ph < ch && cw/pw > ch/ph //both width and height is smaller, ratio at height is smaller ) _qpCurrent = _qpSource.scaledToHeight(ch, Qt::TransformationMode::FastTransformation); int x = (cw - _qpCurrent.width())/2, y = (ch - _qpCurrent.height())/2; QPainter paint(this); paint.drawPixmap(x, y, _qpCurrent); }

Uso : lo mismo que usar una etiqueta normal para mostrar la imagen sin el conjuntoScaledContents

img_Result = new QPictureLabel(ui.parent); layout = new QVBoxLayout(ui.parent); layout->setContentsMargins(11, 11, 11, 11); ui.parent->setLayout(layout); layout->addWidget(img_Result); //{...} QPixmap qpImage(qsImagePath); img_Result->setPixmap(qpImage);