Partage
  • Partager sur Facebook
  • Partager sur Twitter

Afficher une image dans un conteneur sans l'étirer

3 octobre 2018 à 0:29:56

Bonjour,

J'ai fait l'exercice sur le widget à onglet du chapitre 8 du cours sur QT et j'ai voulu afficher une image perso (une belle carte du monde pour tracer la trajectoire de fusées et de satellites du moins c'est le but que je cherche à atteindre :-) seulement avec la fonction que j'ai utilisée (page3->setScaledContents(true)) l'image apparaît bien en entier dans la page de l'onglet mais elle est déformée (étirée vers le haut). Quelqu'un sait-il comment faire pour que l'image soit affichée sur toute la largeur sans être déformée en hauteur ?

Voici mon code :

#include <QApplication>
#include <QtWidgets>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QWidget fenetre;

    // 1 : Créer le QTabWidget
    QTabWidget *onglets = new QTabWidget(&fenetre);
    onglets->setGeometry(30, 20, 340, 260);

    // 2 : Créer les pages, en utilisant un widget parent pour contenir chacune des pages
    QWidget *page1 = new QWidget;
    QWidget *page2 = new QWidget;
    QLabel *page3 = new QLabel; // Comme un QLabel est aussi un QWidget (il en hérite), on peut aussi s'en servir de page

    // 3 : Créer le contenu des pages de widgets

        // Page 1

        QLineEdit *lineEdit = new QLineEdit("Entrez votre nom");
        QPushButton *bouton1 = new QPushButton("Cliquez ici");
        QPushButton *bouton2 = new QPushButton("Ou là…");

        QVBoxLayout *vbox1 = new QVBoxLayout;
        vbox1->addWidget(lineEdit);
        vbox1->addWidget(bouton1);
        vbox1->addWidget(bouton2);

        page1->setLayout(vbox1);

        // Page 2

        QProgressBar *progress = new QProgressBar;
        progress->setValue(50);
        QSlider *slider = new QSlider(Qt::Horizontal);
        QPushButton *bouton3 = new QPushButton("Valider");

        QVBoxLayout *vbox2 = new QVBoxLayout;
        vbox2->addWidget(progress);
        vbox2->addWidget(slider);
        vbox2->addWidget(bouton3);

        page2->setLayout(vbox2);

        // Page 3 (je ne vais afficher qu'une image ici, pas besoin de layout)

        page3->setPixmap(QPixmap("World_map.png"));
        page3->setAlignment(Qt::AlignCenter);
        page3->setScaledContents(true);   //  OK
//        page3->setBaseSize(100,50);       //  NOK
//        page3->setFixedHeight(150);       //  NOK
//        page3->pixmap->scaledToWidth();   //  NOK

    // 4 : ajouter les onglets au QTabWidget, en indiquant la page qu'ils contiennent
    onglets->addTab(page1, "Coordonnées");
    onglets->addTab(page2, "Progression");
    onglets->addTab(page3, "Image");

    fenetre.show();

    return app.exec();
}

Cordialement

Mathieu

  • Partager sur Facebook
  • Partager sur Twitter
8 octobre 2018 à 17:04:05

Hello,

En fait de ce que je pense (ce n'est peut etre pas exact mais c'est le plus plausible que je trouve) le fait d'utiliser setScaledContents pourrait faire en sorte que ton label s'étire à la taille de ton tab...

Si tu ne le mets pas, que se passe-t-il?

Je viens de trouver un vieux topic qui utilise le meme procédé que toi, mais sans les setAlignment et setScaledContents

https://openclassrooms.com/forum/sujet/afficher-une-image-avec-qt-61565

  • Partager sur Facebook
  • Partager sur Twitter
11 octobre 2018 à 0:36:20

Bonjour,

Merci pour votre réponse.

Si je ne met pas setScaledContents l'image s'affiche mais comme elle est trop grande il n'y a que sa partie centrale qui apparaît dans le conteneur. Donc c'est pas bon pour moi...

  • Partager sur Facebook
  • Partager sur Twitter
11 octobre 2018 à 13:20:27

A ce moment là il faut redimensionner l'image mais je ne suis pas assez expert pour cela...

A priori utiliser la fonction scaled avec l'option KeepAspectRatio serait une bonne piste.

Voici la doc de la fonction :

http://doc.qt.io/qt-5/qpixmap.html#scaled

-
Edité par nours59 11 octobre 2018 à 13:27:49

  • Partager sur Facebook
  • Partager sur Twitter