Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Qt] programme qui ne marche que sur mon PC :s

problème de chargement d'un QImage

Sujet résolu
    29 mai 2008 à 11:27:57

    Bonjour. J'ai un problème avec mon programme.
    Je le compile et le lance, il n'y a aucun problème, tout marche pour le mieux.

    Maintenant, je l'envoi sur un autre PC et là, c'est le drame, il se lance bien mais ne veut pas charger d'image dans mon QImage...
    J'ai envoyé le programme avec les dll QtGui4 QtCore4 et mingwm10

    J'ai recherché dans la doc à QImage mais apparemment,; il ne devrait pas y avoir de problème...

    J'ai donc fait des teste. J'ai remarqué que l'adresse de l'image était bonne. (je la charge grace à QFileDialog)
    mais que l'image ne se chargeait pas...
    Voila le code :

    main.cpp
    #include <QApplication>
    #include "MaFenetre.h"
     
    int main(int argc, char *argv[])
    {
        QApplication app(argc, argv);
        
        MaFenetre fenetre;
        fenetre.show();
     
        return app.exec();
    }
    


    MaFenetre.h
    #ifndef DEF_MaFenetre
    #define DEF_MaFenetre
    
    #include <QApplication>
    #include <QMainWindow>
    #include <QMenu>
    #include <QMenuBar>
    #include <QProgressBar>
    #include <QStatusBar>
    #include <QCloseEvent>
    #include "WidgetPrincipal.h"
    
    class MaFenetre : public QMainWindow
    {
        Q_OBJECT;
        
        private:
            WidgetPrincipal a_WidgetCentral;
            
            QMenuBar *a_menuBar;
            QMenu *a_fichierMenu, *a_outilsMenu;
            QAction *a_nouveauAction, *a_ouvrirAction, *a_sauverAction, *a_sauverSousAction, *a_quitterAction;
            QAction *a_flouAction;
            
            QStatusBar *a_statusBar;
            QProgressBar *a_progressBar;
        
        public:
            MaFenetre();
            void addMenu();
            void addStatutBar();
            
        protected:
            void closeEvent(QCloseEvent*);
            void resizeEvent(QResizeEvent*);
        
        public slots: 
            void updateProgressBar(int);
            
            void update(int, int);
            void nouveau();
            void ouvrir();
            void sauvegarder();
            bool sauvegarderSous();
            bool testSauvegarde();
            void quitter();
            void updateImage();
            void flou();
            
    };
    
    #endif
    


    MaFenetre.cpp
    #include "Mafenetre.h"
    
    MaFenetre::MaFenetre() : QMainWindow()
    {
        addMenu();    
        addStatutBar();
        setCentralWidget(&a_WidgetCentral);
        resize(300, 300);
        update(width(), height());
        
        QObject::connect(&a_WidgetCentral, SIGNAL(nouvelleProgression(int)), this, SLOT(updateProgressBar(int)));
    }
    
    void MaFenetre::addMenu()
    {
        // Fichier
        a_nouveauAction = new QAction(tr("&Nouveau"), this);
        a_nouveauAction->setShortcut(tr("Ctrl+N"));
        a_nouveauAction->setStatusTip(tr("Nouvelle image"));
        a_nouveauAction->setIcon(QIcon("new.png"));
        QObject::connect(a_nouveauAction, SIGNAL(triggered()), &a_WidgetCentral, SLOT(nouveau()));
        
        a_ouvrirAction = new QAction(tr("&Ouvrir"), this);
        a_ouvrirAction->setShortcut(tr("Ctrl+O"));
        a_ouvrirAction->setStatusTip(tr("Charger une image"));
        a_ouvrirAction->setIcon(QIcon("open.png"));
        QObject::connect(a_ouvrirAction, SIGNAL(triggered()), &a_WidgetCentral, SLOT(ouvrir()));
        
        a_sauverAction = new QAction(tr("&Sauvegarder"), this);
        a_sauverAction->setShortcut(tr("Ctrl+S"));
        a_sauverAction->setStatusTip(tr("Sauvegarder l'image"));
        a_sauverAction->setIcon(QIcon("save.png"));
        QObject::connect(a_sauverAction, SIGNAL(triggered()), &a_WidgetCentral, SLOT(sauvegarder()));
        
        a_sauverSousAction = new QAction(tr("S&auvegarder sous..."), this);
        a_sauverSousAction->setShortcut(tr("Ctrl+Shift+S"));
        a_sauverSousAction->setStatusTip(tr("Sauvegarder l'image sous..."));
        a_sauverSousAction->setIcon(QIcon("save.png"));
        connect(a_sauverSousAction, SIGNAL(triggered()), &a_WidgetCentral, SLOT(sauvegarderSous()));
        
        a_quitterAction = new QAction(tr("&Quitter"), this);
        a_quitterAction->setStatusTip(tr("Quitter le programme"));
        QObject::connect(a_quitterAction, SIGNAL(triggered()), this, SLOT(close()));
        
        a_fichierMenu = new QMenu(tr("&Fichier"), this);
        a_fichierMenu->addAction(a_nouveauAction);
        a_fichierMenu->addAction(a_ouvrirAction);
        a_fichierMenu->addAction(a_sauverAction);
        a_fichierMenu->addAction(a_sauverSousAction);
        a_fichierMenu->addAction(a_quitterAction);
        
        // Filtre
        a_flouAction = new QAction(tr("&Flou"), this);
        a_flouAction->setStatusTip(tr("Appliquer un flou à l'image"));
        QObject::connect(a_flouAction, SIGNAL(triggered()), &a_WidgetCentral, SLOT(flou()));
        
        a_outilsMenu = new QMenu(tr("F&iltre"), this);
        a_outilsMenu->addAction(a_flouAction);
        
        a_menuBar = new QMenuBar(this);
        a_menuBar->addMenu(a_fichierMenu);
        a_menuBar->addMenu(a_outilsMenu);
        
        setMenuBar(a_menuBar);
    }
    
    void MaFenetre::addStatutBar()
    {
        a_progressBar = new QProgressBar;
        a_progressBar->setValue(0);
        
        a_statusBar = new QStatusBar(this);
        a_statusBar->addWidget(a_progressBar);
        
        setStatusBar(a_statusBar);
    }
    
    void MaFenetre::updateProgressBar(int pourcentage)
    {
        a_progressBar->setValue(pourcentage);
    }
    
    void MaFenetre::closeEvent(QCloseEvent *event)
    {
        if(a_WidgetCentral.quitter())
            event->accept();
        else 
            event->ignore();
    }
    
    void MaFenetre::resizeEvent(QResizeEvent *event)
    {
        int w = width();
        int h = height() - a_menuBar->height() - a_statusBar->height();
        update(w, h);
    }
    
    void MaFenetre::update(int w, int h)
    {
        a_WidgetCentral.update(w, h);
    }
    
    void MaFenetre::nouveau()
    {
        a_WidgetCentral.nouveau();
    }
    
    void MaFenetre::ouvrir()
    {
        a_WidgetCentral.ouvrir();
    }
    
    void MaFenetre::sauvegarder()
    {
        a_WidgetCentral.sauvegarder();
    }
    
    bool MaFenetre::sauvegarderSous()
    {
        return a_WidgetCentral.sauvegarderSous();
    }
    
    bool MaFenetre::testSauvegarde()
    {
        return a_WidgetCentral.testSauvegarde();
    }
    
    void MaFenetre::quitter()
    {
        a_WidgetCentral.quitter();
    }
    
    void MaFenetre::updateImage()
    {
        a_WidgetCentral.updateImage();
    }
    
    void MaFenetre::flou()
    {
        a_WidgetCentral.flou();
        updateImage();
    }
    


    WidgetPrincipal.h
    #ifndef DEF_WidgetPrincipal
    #define DEF_WidgetPrincipal
    
    #include <math.h>
    #include <QApplication>
    #include <QWidget>
    #include <QLabel>
    #include <QMessageBox>
    #include <QFileDialog>
    #include <QInputDialog>
    #include <QImage>
    #include <QRgb>
    #include <QPixmap>
    #include <QScrollArea>
    #include <QPushButton>
    #include <QMessageBox>
    
    class WidgetPrincipal : public QWidget
    {
        Q_OBJECT;
        
        private:
            QImage *a_monImage;
            QLabel *a_afficheur;
            QScrollArea *a_scrollArea;
            
            bool a_isSave;
            QString a_fichierDeSauvegarde;
        
        public:
            WidgetPrincipal();
        
        public slots: 
            void update(int, int);   
            void nouveau();
            void ouvrir();
            void sauvegarder();
            bool sauvegarderSous();
            bool testSauvegarde();
            bool quitter();
            void updateImage();
            void flou();
            
            
        signals:
            void nouvelleProgression(int);
    };
    
    #endif
    


    WidgetPrincipal.cpp
    #include "WidgetPrincipal.h"
    
    WidgetPrincipal::WidgetPrincipal() : QWidget()
    {
        a_afficheur = new QLabel();
        a_scrollArea = new QScrollArea(this);
        a_scrollArea->setBackgroundRole(QPalette::Dark);
        a_scrollArea->setWidget(a_afficheur);
             
        a_fichierDeSauvegarde = "";
        a_isSave = true;
        nouveau();
    
    }
    
    void WidgetPrincipal::update(int w, int h)
    {
        a_scrollArea->setGeometry(0, 0, w, h);
    }
    
    void WidgetPrincipal::nouveau()
    {
         //Nouveau
        if(testSauvegarde())
        {  
            a_monImage = new QImage;
            a_fichierDeSauvegarde = "";
            a_isSave = true;
            updateImage();
        }
    }
    
    void WidgetPrincipal::ouvrir()
    {
        if(testSauvegarde())
        {
            QString fichier = QFileDialog::getOpenFileName(this, "Ouvrir", a_fichierDeSauvegarde, "Images (*.bmp .png *.gif *.jpg *.jpeg)");
            QMessageBox::information(this, "TEST", "Vous avez sélectionner le fichier : " + fichier);
            if(fichier != "")
            {
                // Algo ouverture
    
                a_monImage = new QImage(fichier);   // <============= ça plante ici ... 
                if(a_monImage->isNull())
                {
                    nouveau();
                    QMessageBox::information(this, "Error", "Erreur : aucune image chargée !!");
                }
                else
                {
                    updateImage();
                    a_fichierDeSauvegarde = fichier;
                    a_isSave = true;
                }
            }
        }
    }
    
    void WidgetPrincipal::sauvegarder()
    {
         bool reponse = true;
         if(a_fichierDeSauvegarde.isEmpty())
             reponse = sauvegarderSous();
         
         if(reponse == true)
         {
             // Algo saugevarde  
             a_monImage->save(a_fichierDeSauvegarde);
             a_isSave = true;
         }
    }
    
    bool WidgetPrincipal::sauvegarderSous()
    {
        QString fichier = QFileDialog::getSaveFileName(this, "Enregistrer", a_fichierDeSauvegarde, "Images (*.bmp .png *.gif *.jpg *.jpeg)");
    
        if(fichier.isEmpty())
            return false;
            
        /*if(QFile::exists(fichier))
        {
            int reponse = QMessageBox::question(this, "Attention", "Ce fichier existe déjà !\nVoulez-vous l'écraser ?", QMessageBox::Yes | QMessageBox::No);
     
            if (reponse == QMessageBox::No)
                return false;
        }*/
        a_fichierDeSauvegarde = fichier;
        sauvegarder();
        
        return true;
    }
    
    bool WidgetPrincipal::testSauvegarde()
    {
        bool succeed = true;
        int reponse = 0;
        if(!a_isSave)
        {
            reponse = QMessageBox::question(this, "Confirmation", "Voulez-vous enregistrer l'image ?", QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel);
     
            if (reponse == QMessageBox::Yes)
                succeed = sauvegarderSous();    
        }
        
        if(succeed and reponse != QMessageBox::Cancel)
            return true;
        return false;
    }
    
    bool WidgetPrincipal::quitter()
    {
        return testSauvegarde();
    }
    
    void WidgetPrincipal::updateImage()
    {
        a_afficheur->setGeometry(0, 0, a_monImage->width(), a_monImage->height());
        a_afficheur->setPixmap(QPixmap::fromImage(*a_monImage));
    }
    
    void WidgetPrincipal::flou()
    {    
        // Algo flou
        QColor value;
        int temp, compteur, r, g, b, progression = 0;
        int entier = QInputDialog::getInteger(this, "Flou", "Rayon du flou (pixel)", 2, 0, ((a_monImage->width()>a_monImage->height())*a_monImage->width() + (a_monImage->width()<=a_monImage->height())*a_monImage->height())/2);
        if(entier != 0 && a_monImage->width() != 0 && a_monImage->height() != 0)
        {
            a_isSave = false;
            for(int x = 0; x < a_monImage->width(); x++)
            {
                for(int y = 0; y < a_monImage->height() ; y++)
                {
                    r=0; g=0; b=0;
                    compteur = 0;
                    for(int i = x-entier; i <= x+entier; i++)
                    {
                        for(int j = y-entier; j <= y+entier; j++)
                        {
                            if(i>=0 && i<a_monImage->width() && j>=0 && j<a_monImage->height())
                            {
                                value = a_monImage->pixel(i, j);
                                r += value.red();
                                g += value.green();
                                b += value.blue();
                                compteur++;
                            }
                        }
                    }
                    value.setRgb(r/compteur, g/compteur, b/compteur);
                    a_monImage->setPixel(x, y, value.rgb());
                    temp = (100*(x+1)*a_monImage->height()+(y+1))/(a_monImage->height()*a_monImage->width());
                    if((int)temp != (int)progression)
                    {
                        progression = temp;
                        emit nouvelleProgression(progression);
                    }
                }
            }
            emit nouvelleProgression(0);
        }
        updateImage();
    }
    

    • Partager sur Facebook
    • Partager sur Twitter
      31 mai 2008 à 21:30:51

      up, personne ne sais ??
      Ai-je oublier de linker quelque chose ?? ou une dll que j'ai oublié de mettre dans le pack ?
      • Partager sur Facebook
      • Partager sur Twitter
        31 mai 2008 à 21:50:42

        bon question idiote ^^
        tu a mis les images avec ?
        • Partager sur Facebook
        • Partager sur Twitter
          1 juin 2008 à 0:00:57

          vas dans :
          C:\Qt\<taVersionDeQt>\plugins
          fait clique droit sur le dossier imageformats
          copier
          va dans le dossier de ton *.exe et coller.
          Ne rien changer.
          Normalement c'est bon.
          • Partager sur Facebook
          • Partager sur Twitter
          :)
            1 juin 2008 à 12:06:10

            En effet, avec ces dll en plus, le programme charge bien mon image :)

            Merci à moii :p
            • Partager sur Facebook
            • Partager sur Twitter

            [Qt] programme qui ne marche que sur mon PC :s

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown