IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Discussion :

Emission d'un signal lors d'un click sur une image

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 102
    Par défaut Emission d'un signal lors d'un click sur une image
    Bonjour,

    Le problème est dans le titre...
    Voici mon code (J'ai créer une classe sur la base d'un QLabel qui emet un signal lorsque un bouton de souris est pressé):

    le .h
    Code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class monLabel : public QLabel
    {
        Q_OBJECT
        public:
            monLabel(QWidget * parent=0,Qt::WindowFlags f = 0);
            void setValue(const int var);
            int getValue();
        protected:
            void mousePressEvent(QMouseEvent);
        signals:
            void onClicked(const int var);
        private    :
            int m_var;
    };
    le .cpp
    Code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    monLabel::monLabel(QWidget * parent,Qt::WindowFlags f) : QLabel(parent,f)
    {
        m_var=-1;
    }
     
    void monLabel::mousePressEvent(QMouseEvent)
    {
            emit onClicked(m_var);
    }
     
    void monLabel::setValue(const int var)
    {
        m_var=var;
    }
     
    int monLabel::getValue()
    {
        return m_var;
    }
    la suite du cpp
    Code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    void FenPrincipale::ouvrirRep()
    {        
         QDir directory = QFileDialog::getExistingDirectory(this, tr("Recherche de fichiers"), QDir::currentPath());        
            QString fileName = "*.jpg";
            QStringList files;
            files = directory.entryList(QStringList(fileName),QDir::Files | QDir::NoSymLinks);
               imageLabel = new monLabel[files.count()];
     
            scrollArea = new QScrollArea;
            scrollArea->setBackgroundRole(QPalette::Dark);
     
            QHBoxLayout *imageLayout = new QHBoxLayout;
     
     
            for (int i = 0; i < files.count(); ++i)
            {
                QImage image(directory.absoluteFilePath(files[i]));
                image=image.scaled(100,100, Qt::KeepAspectRatio,Qt::FastTransformation);
                imageLabel[i].setPixmap(QPixmap::fromImage(image));
                imageLabel[i].setValue(i);
                imageLayout->addWidget(&imageLabel[i]);
                connect(&imageLabel[i], SIGNAL(onClicked(int)), this, SLOT(afficheImageGrand(int)));
            }
     
            QGroupBox *groupImage = new QGroupBox("Groupe d'Images");
            groupImage->setLayout(imageLayout);
     
     
              scrollArea->setWidget(groupImage);
            scrollArea->setWidgetResizable(true);
     
            setCentralWidget(scrollArea);
     
            QHBoxLayout *imagesLayout = new QHBoxLayout;
     
            setLayout(imagesLayout);
    }
     
    void FenPrincipale::afficheImageGrand(const int i)
    {
         QMessageBox::information(this, "test",QVariant(i).toString());
    }
    Seulement voilà, lorsque je clique sur une image, il ne se passe rien :-(
    Avez vous une idée d'où peut venir mon erreur?
    Merci d'avance

  2. #2
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Salut.
    Pas trop d'idée pour l'instant.
    Juste deux trois remarque :
    1- void onClicked(const int var); le const ne sert pas à grand chose ici
    2- void mousePressEvent(QMouseEvent); utiliser le release est plus naturelle

    SInon que cherche tu à faire? tu veut faire correspondre un click sur label vers un nombre, c'est cela?

    le label peut fournir le signal http://qt.developpez.com/doc/4.4/qlabel/#linkactivated
    et cette QR http://qt.developpez.com/faq/?page=q...uter_lien_html explique indirectement comment générer ce signal.

    Ensuite il existe un class qui convertie n'importe quel signal en un signal avec un int :
    http://qt.developpez.com/doc/4.4/qsignalmapper/

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 102
    Par défaut
    Salut,
    merci pour ta réponse.

    hum hum... Interéssant...
    Bon je t'explique mon but. Je souhaite realiser une appli un peu dans le style de l'ancien pixvue sous windows. Le but étant de la faire correspondre à mes besoins de tri de photo. Dans un premier temps je souhaite créer une barre de défilement avec les miniatures de photo (c'est en gros ce que j'ai codé jusque là) et lorsqu'on clique sur la miniature un agrandissement est affiché. C'est pourquoi j'essaie de récupérer le n° de la photo cliquée. A terme il y aura une partie avec des onglets qui renseigneront sur les métadonnées EXIF et IPTC de la photo.

    Maintenant, je suis étonné par le temps de chargement des photos. Pour l'instant je teste avec 3 photos, mais cela prends déjà près d'une seconde (le temps de charger et de minaturiser). Est-ce que tu penses qu'en créant un text html avec la balise img au lieu de charger directement la photo dans un pixmap, le temps de chargement sera plus court? Cela résoudrait en même temps mon problème de signal... Mais dans ce cas vers quel lien l'envoyer?

  4. #4
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par peuf23 Voir le message
    Salut,
    merci pour ta réponse.

    hum hum... Interéssant...
    Bon je t'explique mon but. Je souhaite realiser une appli un peu dans le style de l'ancien pixvue sous windows. Le but étant de la faire correspondre à mes besoins de tri de photo. Dans un premier temps je souhaite créer une barre de défilement avec les miniatures de photo (c'est en gros ce que j'ai codé jusque là) et lorsqu'on clique sur la miniature un agrandissement est affiché. C'est pourquoi j'essaie de récupérer le n° de la photo cliquée. A terme il y aura une partie avec des onglets qui renseigneront sur les métadonnées EXIF et IPTC de la photo.
    créé une image clickable avec son lien pourrais être intéressant. Charger toute les image en mémoire risque de faire exploser ta ram.
    Pour faire tes miniature, tu pourrai utiliser les Qt::concurent
    voici un exemple qui fait des miniature d'image :http://qt.developpez.com/doc/4.4/qtconcurrent-map/

    Maintenant, je suis étonné par le temps de chargement des photos. Pour l'instant je teste avec 3 photos, mais cela prends déjà près d'une seconde (le temps de charger et de minaturiser). Est-ce que tu penses qu'en créant un text html avec la balise img au lieu de charger directement la photo dans un pixmap, le temps de chargement sera plus court? Cela résoudrait en même temps mon problème de signal... Mais dans ce cas vers quel lien l'envoyer?
    tu ne serait pas en debug?

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 102
    Par défaut
    oui c'est bien ce que je craingnais... Je vais voir du côté de Qt::concurent, ça m'a l'air prometteur...

    Oui je suis en débug, pourquoi, cela change-t-il le temps de chargement?

    Pour info on vient de me montrer mon erreur sur un autre forum. J'ai oublié le "*" dans le mouseReleaseEvent(QMouseEvent *)...

    Ps:
    créé une image clickable avec son lien pourrais être intéressant
    Oui mais vers quel lien??? Pour l'instant les images sont sur mon disque en local.

  6. #6
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par peuf23 Voir le message
    Oui je suis en débug, pourquoi, cela change-t-il le temps de chargement?
    debug c'est lent


    Citation Envoyé par peuf23 Voir le message
    Oui mais vers quel lien??? Pour l'instant les images sont sur mon disque en local.
    le lien peut être le path de ton image. Aprés c'est toi qui gère le lien

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 102
    Par défaut
    Salut,

    J'ai eu un peu le temps de reprendre, mais je me heurte à un problème. Voici mon code actuel, mais lorsque je clique sur l'image, le programme quitte purement et simplement, sans même indiquer un run time error...

    Pourrais-tu jeter un coup d'oeil?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
     
    #include "FenPrincipale.h"
    #include <qtconcurrentmap.h>
     
     QImage scale(const QString &name)
     {
        QImage image(name);
        return image.scaled(100, 100,Qt::KeepAspectRatio);
     }
     
    void FenPrincipale::traitementImages()
    {
    	    QTimer::singleShot(0 , this , SLOT( charger() ));
     
    	    miniLayout = new QHBoxLayout;
    	    QGroupBox *groupMiniatures = new QGroupBox("Miniatures:");
        	groupMiniatures->setLayout(miniLayout);
     
            imageGrandeLayout = new QHBoxLayout;
         	QGroupBox *groupImageGrande = new QGroupBox("Image:");       
        	groupImageGrande->setLayout(imageGrandeLayout);
     
        	QLabel *metaData = new QLabel;
        	QHBoxLayout *metaDataLayout = new QHBoxLayout;
            metaDataLayout->addWidget(metaData);
        	QGroupBox *groupMetaData = new QGroupBox("Métadonnées:");
        	groupMetaData->setLayout(metaDataLayout);
     
     
        	QGridLayout *triLayout = new QGridLayout;
    		triLayout->addWidget(groupMetaData,0,0,1,1);
        	triLayout->addWidget(groupImageGrande,0,1,1,1);
        	triLayout->addWidget(groupMiniatures,1,0,1,2);
     
    		QWidget *w = new QWidget;
    		w->setLayout(triLayout);
    		mainLayout->addWidget(w);
    }
     
     
    void FenPrincipale::charger()
    {	    
     
        /*recupere un repertoire*/
        QString s = QFileDialog::getExistingDirectory(this);
        if(s.isEmpty()) return;
        QDir  imageDir(s);
        QStringList fileFilter;
        /*recupere toute les nom d'image*/
        fileFilter << "*.png" << "*.jpg" <<"*.gif" << "*.bmp" << "*.ppm" << "*.pgm";
    	QStringList lImage = imageDir.entryList(fileFilter,QDir::Files);        
     
        /*ajoute le path des images*/
        for(int i=0;i<lImage.size();++i)
        {
            lImage[i] = imageDir.absolutePath() + "/" + lImage[i];
        }
    	pathImages = new QStringList;
    	pathImages = &lImage;
        /*dialog avec bar de progression*/
        QProgressDialog dialog
                (
                        QString("Progression utilisant %1 thread(s)...").arg(QThread::idealThreadCount()),
                        "Stop",
                        0,100
                );
     
        /*futurewatcher recuperant l'avancement et le resultat du mapped*/
        QFutureWatcher<QImage> futureWatcher;
        QObject::connect(&futureWatcher, SIGNAL(finished()), &dialog, SLOT(reset()));
        QObject::connect(&dialog, SIGNAL(canceled()), &futureWatcher, SLOT(cancel()));
        QObject::connect(&futureWatcher, SIGNAL(progressRangeChanged(int, int)), &dialog, SLOT(setRange(int, int)));
        QObject::connect(&futureWatcher, SIGNAL(progressValueChanged(int)), &dialog, SLOT(setValue(int)));
     
        /*a chaque nouvelle imagette genere on l'affiche*/
        QObject::connect(&futureWatcher, SIGNAL(resultReadyAt ( int  )),this,SLOT(newImage(int)));
     
        /*lancement du mapped*/
        futureWatcher.setFuture(QtConcurrent::mapped(lImage,scale ));
     
        /*permet de certifier que futureWatcher et lImage ne sont pas détruit avant la fin du mapped*/
        dialog.exec();
     
        /*attend la fin des traitement en cours*/
        futureWatcher.waitForFinished();
     
    }
     
    void FenPrincipale::newImage(int index)
    {
        /*on récuper le sender du signal connecte*/
         QFutureWatcher<QImage> * watcher =static_cast< QFutureWatcher<QImage> * >(sender());
         if (!watcher) return;
     
         /*creation d'un QLabel et ajout dans le layout d'image*/
         monLabel *label = new monLabel;
         label->setPixmap( QPixmap::fromImage(watcher->resultAt (index)) );
         label->setValue(index);
         miniLayout->addWidget(label);
         connect(label, SIGNAL(onClicked(int)), this, SLOT(afficheImageGrand(int)));
    }
     
    void FenPrincipale::afficheImageGrand(int i)
    {
        	QLabel *imageGrande = new QLabel;
        	QMessageBox::critical(this, "test", pathImages->at(i));
            //QImage image(pathImages->at(i));
            //imageGrande->setPixmap(QPixmap::fromImage(image));
            imageGrandeLayout->addWidget(imageGrande);
    }
     
    monLabel::monLabel(QWidget * parent,Qt::WindowFlags f) : QLabel(parent,f)
    {
    	m_var=-1;
    }
     
    void monLabel::mouseReleaseEvent(QMouseEvent *)
    {
        	emit onClicked(m_var);
    }
     
    void monLabel::setValue(int var)
    {
    	m_var=var;
    }
     
    int monLabel::getValue()
    {
    	return m_var;
    }
    Merci d'avance ;-)

  8. #8
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par peuf23 Voir le message
    Salut,

    J'ai eu un peu le temps de reprendre, mais je me heurte à un problème. Voici mon code actuel, mais lorsque je clique sur l'image, le programme quitte purement et simplement, sans même indiquer un run time error...

    Pourrais-tu jeter un coup d'oeil?
    utilise tu le debugger?
    je veut bien jeter un coup d'œil, mais faudrait,si possible, un version compilable

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 102
    Par défaut
    ok, merci...
    Heu oui il me semble que j'utilise le debuger. Enfin, j'ai eu droit à d'autres erreurs avant que j'arrive à compiler.

    voici le tout:

    main.cpp

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    #include <QApplication>
    #include <QTranslator>
    #include <QLocale>
    #include <QLibraryInfo>
    #include "FenPrincipale.h"
    //  #include "main.moc"
     
    int main(int argc, char* argv[])
    {
        QApplication app(argc, argv);
     
        // Traduction des chaînes prédéfinies par Qt dans notre langue
        QString locale = QLocale::system().name();
        QTranslator translator;
        translator.load(QString("qt_") + locale, QLibraryInfo::location(QLibraryInfo::TranslationsPath));
        app.installTranslator(&translator);
     
        // Ouverture de la fenêtre principale du navigateur
        FenPrincipale principale;
        principale.show();
     
        return app.exec();
    }
    FenPrincipale.cpp

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
     
    #include "FenPrincipale.h"
     
    FenPrincipale::FenPrincipale()
    {
        // Génération des widgets de la fenêtre principale
        creerActions();
        creerMenus();
        //creerBarresOutils();
     
        // Génération des onglets et chargement de la page d'accueil
        //onglets = new QTabWidget;
    	//connect(onglets, SIGNAL(currentChanged(int)), this, SLOT(changementOnglet(int)));
     
        // Définition de quelques propriétés de la fenêtre
        setMinimumSize(500, 500);
        //setWindowIcon(QIcon("images/VoPhotos.png"));
        setWindowTitle(tr("VoPhotos"));
     
        QWidget *w = new QWidget;
        mainLayout = new QHBoxLayout;
        w->setLayout(mainLayout);
     
        setCentralWidget(w);
        //setWidgetResizable (true);
    }
     
    void FenPrincipale::creerActions()
    {
        //Fichier
        actionOuvrirRep = new QAction(tr("&Définir un répertoire racine"), this);
        //actionAPropos->setIcon(QIcon("images/information.png"));    
        connect(actionOuvrirRep, SIGNAL(triggered()), this, SLOT(traitementImages()));
        //actionAPropos->setShortcut(QKeySequence::HelpContents);
     
        //Autres...
        actionAPropos = new QAction(tr("&A propos..."), this);
        //actionAPropos->setIcon(QIcon("images/information.png"));    
        connect(actionAPropos, SIGNAL(triggered()), this, SLOT(aPropos()));
        actionAPropos->setShortcut(QKeySequence::HelpContents);
     
        actionQuitter = new QAction(tr("&Quitter"), this);
        //actionQuitter->setIcon(QIcon("images/quitter.png"));    
        actionQuitter->setShortcut(tr("Ctrl+Q"));
        connect(actionQuitter, SIGNAL(triggered()), qApp, SLOT(quit()));
    }
     
    void FenPrincipale::creerMenus()
    {
        //Fichier
        QMenu *menuFichier = menuBar()->addMenu(tr("&Fichier"));
        menuFichier->addAction(actionOuvrirRep);
        menuFichier->addAction(actionQuitter);
     
        //Aide
        QMenu *menuAide = menuBar()->addMenu(tr("&?"));
    	menuAide->addAction(actionAPropos);
    }
     
    //void FenPrincipale::creerBarresOutils()
    //{
        //QToolBar *toolBarCommande = addToolBar(tr("XXXX"));
        //toolBarCommande->addAction(actionXXXX);
    //}
     
     
    //bool FenPrincipale::no_onglet(QString nom)
    //{
    //	bool test=true;
    //	for(int i=0;i<onglets->count();i++)
    //	{
    //		if(onglets->tabText(i) == nom)
    //		{
    //			test=false;
    //		}
    //	}
    //	return test;
    //}
     
    //void FenPrincipale::changementOnglet(int index)
    //{
    //}
     
     
    void FenPrincipale::aPropos()
    {
        QMessageBox::information(this, tr("A propos..."), tr("VoPhotos est un projet réalisé pour le tri et le référencement des photos. Il utilise les métadonnées inclus dans la plupart des formats de fichiers photos pour référencer l'ensemble des photos dans une base de donnée.<br /> Ce programme a été réalisé par V.Maurer entre le 28/11/2008 et le 00/00/0000.<br /> Version (beta): 0.0.0.<br />"));
    }
    FenPrincipale.h

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
     
    #ifndef HEADER_FENPRINCIPALE
    #define HEADER_FENPRINCIPALE
     
    #include <QtGui>
    #include <QtSql>
     
    class monLabel : public QLabel
    {
    	Q_OBJECT
        public:
            monLabel(QWidget * parent=0,Qt::WindowFlags f = 0);
            void setValue(int var);
            int getValue();
        protected:
            void mouseReleaseEvent(QMouseEvent *);
        signals:
        	void onClicked(int var);
        private	:
        	int m_var;
    };
     
    class FenPrincipale : public QMainWindow
    {
        Q_OBJECT
    	QLayout *mainLayout;
     
        public:
            FenPrincipale();
        private:
            void creerActions();
            void creerMenus();
            QLabel *label;
            QHBoxLayout *miniLayout;
            QHBoxLayout *imageGrandeLayout;
            QStringList *pathImages;
            //QHBoxLayout *layout;
            //QScrollArea *scrollArea;
            //QStringList *files;
            //void creerBarresOutils();
    		//Onglets
            //QTabWidget *onglets;
            //void *creerAfficherOnglets(QVBoxLayout layout, QString nom);
    		//bool FenPrincipale::no_onglet(QString nom);			
     
        private slots:
     
            void aPropos();
            //void changementOnglet(int index);
            //Fichier 
            void traitementImages();
            void charger();
            void afficheImageGrand(int i);
            void newImage(int index);
     
        private:
            //Fichier
            QAction *actionOuvrirRep;
            QAction *actionQuitter;
            QAction *actionAPropos;
     
    };
     
    #endif
    affiche.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
     
    #include "FenPrincipale.h"
    #include <qtconcurrentmap.h>
     
     QImage scale(const QString &name)
     {
        QImage image(name);
        return image.scaled(100, 100,Qt::KeepAspectRatio);
     }
     
    void FenPrincipale::traitementImages()
    {
    	    QTimer::singleShot(0 , this , SLOT( charger() ));
     
    	    miniLayout = new QHBoxLayout;
    	    QGroupBox *groupMiniatures = new QGroupBox("Miniatures:");
        	groupMiniatures->setLayout(miniLayout);
     
            imageGrandeLayout = new QHBoxLayout;
         	QGroupBox *groupImageGrande = new QGroupBox("Image:");       
        	groupImageGrande->setLayout(imageGrandeLayout);
     
        	QLabel *metaData = new QLabel;
        	QHBoxLayout *metaDataLayout = new QHBoxLayout;
            metaDataLayout->addWidget(metaData);
        	QGroupBox *groupMetaData = new QGroupBox("Métadonnées:");
        	groupMetaData->setLayout(metaDataLayout);
     
     
        	QGridLayout *triLayout = new QGridLayout;
    		triLayout->addWidget(groupMetaData,0,0,1,1);
        	triLayout->addWidget(groupImageGrande,0,1,1,1);
        	triLayout->addWidget(groupMiniatures,1,0,1,2);
     
    		QWidget *w = new QWidget;
    		w->setLayout(triLayout);
    		mainLayout->addWidget(w);
    }
     
     
    void FenPrincipale::charger()
    {	    
     
        /*recupere un repertoire*/
        QString s = QFileDialog::getExistingDirectory(this);
        if(s.isEmpty()) return;
        QDir  imageDir(s);
        QStringList fileFilter;
        /*recupere toute les nom d'image*/
        fileFilter << "*.png" << "*.jpg" <<"*.gif" << "*.bmp" << "*.ppm" << "*.pgm";
    	QStringList lImage = imageDir.entryList(fileFilter,QDir::Files);        
     
        /*ajoute le path des images*/
        for(int i=0;i<lImage.size();++i)
        {
            lImage[i] = imageDir.absolutePath() + "/" + lImage[i];
        }
    	pathImages = new QStringList;
    	pathImages = &lImage;
        /*dialog avec bar de progression*/
        QProgressDialog dialog
                (
                        QString("Progression utilisant %1 thread(s)...").arg(QThread::idealThreadCount()),
                        "Stop",
                        0,100
                );
     
        /*futurewatcher recuperant l'avancement et le resultat du mapped*/
        QFutureWatcher<QImage> futureWatcher;
        QObject::connect(&futureWatcher, SIGNAL(finished()), &dialog, SLOT(reset()));
        QObject::connect(&dialog, SIGNAL(canceled()), &futureWatcher, SLOT(cancel()));
        QObject::connect(&futureWatcher, SIGNAL(progressRangeChanged(int, int)), &dialog, SLOT(setRange(int, int)));
        QObject::connect(&futureWatcher, SIGNAL(progressValueChanged(int)), &dialog, SLOT(setValue(int)));
     
        /*a chaque nouvelle imagette genere on l'affiche*/
        QObject::connect(&futureWatcher, SIGNAL(resultReadyAt ( int  )),this,SLOT(newImage(int)));
     
        /*lancement du mapped*/
        futureWatcher.setFuture(QtConcurrent::mapped(lImage,scale ));
     
        /*permet de certifier que futureWatcher et lImage ne sont pas détruit avant la fin du mapped*/
        dialog.exec();
     
        /*attend la fin des traitement en cours*/
        futureWatcher.waitForFinished();
     
    }
     
    void FenPrincipale::newImage(int index)
    {
        /*on récuper le sender du signal connecte*/
         QFutureWatcher<QImage> * watcher =static_cast< QFutureWatcher<QImage> * >(sender());
         if (!watcher) return;
     
         /*creation d'un QLabel et ajout dans le layout d'image*/
         monLabel *label = new monLabel;
         label->setPixmap( QPixmap::fromImage(watcher->resultAt (index)) );
         label->setValue(index);
         miniLayout->addWidget(label);
         connect(label, SIGNAL(onClicked(int)), this, SLOT(afficheImageGrand(int)));
    }
     
    void FenPrincipale::afficheImageGrand(int i)
    {
        	QLabel *imageGrande = new QLabel;
        	QMessageBox::critical(this, "test", pathImages->at(i));
            //QImage image(pathImages->at(i));
            //imageGrande->setPixmap(QPixmap::fromImage(image));
            imageGrandeLayout->addWidget(imageGrande);
    }
     
    monLabel::monLabel(QWidget * parent,Qt::WindowFlags f) : QLabel(parent,f)
    {
    	m_var=-1;
    }
     
    void monLabel::mouseReleaseEvent(QMouseEvent *)
    {
        	emit onClicked(m_var);
    }
     
    void monLabel::setValue(int var)
    {
    	m_var=var;
    }
     
    int monLabel::getValue()
    {
    	return m_var;
    }

    Voilà, j'espère que ca va t'aider....

  10. #10
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    pourauoi pathImages est un pointeur????
    ton plantage vien de là.
    Tu initialise ce pointeur avec une QStringList qui va être détruite => plantage

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [NET4.0] Binding event lors du click sur une Image
    Par aram2 dans le forum Windows Presentation Foundation
    Réponses: 5
    Dernier message: 08/06/2010, 09h19
  2. Réponses: 1
    Dernier message: 21/07/2009, 22h18
  3. Réponses: 6
    Dernier message: 15/03/2006, 17h10
  4. Débutant - deux on click sur une image
    Par Space Cowboy dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 27/01/2006, 15h25
  5. Gestion des évènements lors d'un clique sur une image.
    Par yoghisan dans le forum Débuter
    Réponses: 7
    Dernier message: 23/06/2005, 19h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo