Comment redimensionner une image à l'échelle dans Qt?
J'ai fait une classe appelée ImageLabel qui s'étend QLabel. Je veux garder le ratio de la taille de l'image qu'il affiche n'importe comment étendu qu'il est. Cela fonctionne bien lorsque vous agrandissez la fenêtre. Le problème vient quand vous essayez de faire de la fenêtre plus petite: il ne marche pas redimensionner la hauteur, elle la laisse tendue. Comment puis-je résoudre ce problème?
int ImageLabel::heightForWidth(int width) const {
int height = (this->size.height()*width)/this->size.width();
return height;
}
QSize ImageLabel::sizeHint() const {
return this->size;
}
QSize ImageLabel::minimumSizeHint() const {
return QSize(0, 0);
}
void ImageLabel::setSizePolicy(){
QSizePolicy policy = QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
policy.setHeightForWidth(true);
QLabel::setSizePolicy(policy);
QLabel::setScaledContents(true);
}
void ImageLabel::setPixmap ( const QPixmap &pixmap ){
this->size = pixmap.size();
QLabel::setPixmap(pixmap);
}
int main(int argc, char *argv[]){
QApplication a(argc, argv);
QFrame *frame = new QFrame;
QVBoxLayout *layout = new QVBoxLayout;
frame->setLayout(layout);
QPixmap map;
map.load("test.png");
ImageLabel *label = new ImageLabel;
label->setSizePolicy();
label->setPixmap(map);
layout->addWidget(label);
frame->show();
return a.exec();
}
source d'informationauteur chacham15
Vous devez vous connecter pour publier un commentaire.
Il ya un couple de façons de le faire, mais la plupart de tout ce que je recommanderais peut-être pas lutter contre le système de mise en page en essayant de faire allusion à l'aspect. Comme vous pouvez le voir, vous avoir à les essayer et de mettre en œuvre un certain nombre de méthodes d'essayer d'aider la mise en page.
Je peux proposer deux exemples. Aucun d'entre eux utilisent des mises en page...
La première utilise un enfant
QLabel
pour afficher l'image, et les lecteurs de sa taille fixe hors tension de l'événement resize:Le deuxième exemple est basé sur la réponse donnée par @Arnold_Spence. C'est encore plus court qu'il n'a pas d'enfants avec un QLabel. Il attire tout le pixmap dans la peinture de l'événement:
Il n'y a pas d'installation construite en
QLabel
pour maintenir le ratio d'aspect de l'image. DepuisQlabel
a probablement des fonctionnalités que vous n'avez pas besoin, vous devriez la sous-classeQWidget
et remplacer lepaintEvent()
pour rendre l'image comme vous le souhaitez.