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

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 102
    Points : 53
    Points
    53
    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 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    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 du Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 102
    Points : 53
    Points
    53
    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 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    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 du Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 102
    Points : 53
    Points
    53
    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 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    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 du Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 102
    Points : 53
    Points
    53
    Par défaut
    ah ok, je ne savais pas qu'il y avait une différence entre debug et release en terme de rapidité...

    Pour le lien, oui de toute façon je l'ai dans ma variable file. Mais bon je ne souhaite pas non plus que mon navigateur s'ouvre quand je clique sur une photo...

    Je suis en train de regarder la doc de Qt::concurent. Je ne comprends pas bien ce que c'est. C'est une classe? C'est adapté pour les processeur multi-core? En fait je ne comprends pas ce qui fait que ça va me sauver ma ram...

  8. #8
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par peuf23 Voir le message
    Je suis en train de regarder la doc de Qt::concurent. Je ne comprends pas bien ce que c'est. C'est une classe? C'est adapté pour les processeur multi-core? En fait je ne comprends pas ce qui fait que ça va me sauver ma ram...
    Qt::concurrent va effectuer le même traitement sur un ensemble en multithread.
    Tu pourrai ainsi optimiser la création tes imagettes sans difficulté
    En gros, tu créé une QStringList qui contient les path de tes images et tu te sert de Qt::concurrent pour créé tes imagettes.

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 102
    Points : 53
    Points
    53
    Par défaut
    Dans l'exemple, ils utilisent blockingMapped sur un QList de QImage pour redonner un QList de QImage.

    Est-il possible de lui entrer un QStringList (path de mes photos) et d'avoir en sortie un QList de QImage (imagettes)? Si je dois créer un QList de QImage cela revient à charger mes photos et je retombe à la case départ, non?

  10. #10
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par peuf23 Voir le message
    Dans l'exemple, ils utilisent blockingMapped sur un QList de QImage pour redonner un QList de QImage.
    Il faut mieus utiliser mapped

    Est-il possible de lui entrer un QStringList (path de mes photos) et d'avoir en sortie un QList de QImage (imagettes)?
    oui

    Si je dois créer un QList de QImage cela revient à charger mes photos et je retombe à la case départ, non?
    C'est juste une optimisation qui as un interré vue ce que tu veut faire.
    oui et non car tu va utiliser la capacité de la machine (multi coeur) pour créé tes imagettes et surtout éviter de freezer ton ihm pendant le chargement. Si tu as beaucoup de grande images, ça peut être très intéressant.
    [edit] du coup l'histoire avec le QLabel et le link ne marchera pas.

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 102
    Points : 53
    Points
    53
    Par défaut
    map me semble encore mieux. Il modifie directement la séquence sans en créer une autre...

    Ok, j'essaie dans un premier temps de faire fonctionner l'exemple dans mon prog.

    Ensuite je chercherai comment faire pour entrer un QStringList (path de mes photos) et d'avoir en sortie un QList de QImage (imagettes)...
    Je reviendrai te voir si je n'y arrive pas


    En tout cas merci. J'ai appris pas mal de choses ce matin...

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 102
    Points : 53
    Points
    53
    Par défaut
    Bon alors, j'ai réussi sans trop de problème à implémenter l'exemple dans mon code.

    Ensuite je suis passé de blockingMapped à mapped. Là les choses se compliquent, mais j'y suis arrivé. Je soupsonne toutefois qu'il y a de la stratégie dans l'air pour optimiser les choses... Je te laisse mon code pour avoir ton avis.

    Ensuite j'ai essayé d'entrer un QStringList (path de mes photos) et d'avoir en sortie un QList de QImage (imagettes). Je ne vois pas ce que je peux faire d'autre que de remplacer images par absPath (cf code). Mais là, ça plante...

    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
     
    		QStringList absPath;       
     
         	// Create a list containing imageCount images.
         	QList<QImage> images;
         	for (int i = 0; i < files.count(); ++i)
         	{
             images.append(QImage(directory.absoluteFilePath(files[i])));
             absPath.append(directory.absoluteFilePath(files[i]));
         	}
         	// Use QtConcurrentBlocking::mapped to apply the scale function to all the
         	// images in the list.
         	QFuture<QImage> future = QtConcurrent::mapped(images, scale);
     
     
            for (int i = 0; i < files.count(); ++i)
            {
          	  //QImage image(directory.absoluteFilePath(files[i]));
          	  //image=image.scaled(100,100, Qt::KeepAspectRatio,Qt::FastTransformation);
          	  QImage thumbnails=future.resultAt(i);
          	  imageLabel[i].setPixmap(QPixmap::fromImage(thumbnails));
          	  imageLabel[i].setValue(i);
          	  imageLayout->addWidget(&imageLabel[i]);
          	  connect(&imageLabel[i], SIGNAL(onClicked(int)), this, SLOT(afficheImageGrand(int)));
            }

  13. #13
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par peuf23 Voir le message
    Ensuite je suis passé de blockingMapped à mapped. Là les choses se compliquent, mais j'y suis arrivé. Je soupsonne toutefois qu'il y a de la stratégie dans l'air pour optimiser les choses... Je te laisse mon code pour avoir ton avis.
    Comment utilise QFuturWatcher? je n'ai pas vue d'attente ou autre.
    Fut bien faire attention à la durée de vie de tes variables
    Je suis en train de te faire un exemple simple

  14. #14
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Voili voilou.
    Au lieu du scroll area, il me semble que listView pourrais faire l'affaire, mais je ne connait pas.
    Tu as juste à copier le code dans fichier main.cpp puis
    qmake -project
    qmkae
    make
    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
     
    #include <QtGui>
     
     
    /*foncteur : convertie path d'une image en imagette*/
     QImage scale(const QString &name)
     {
        QImage image(name);
        return image.scaled(50, 50,Qt::KeepAspectRatio);
     }
     
     
     
    class thumbnail : public QScrollArea
    {
        Q_OBJECT
     
        QLayout * layout;
    public :
        thumbnail()
        {
            QWidget *w = new QWidget;
            layout = new QHBoxLayout;
            w->setLayout(layout);
     
            setWidget(w);
            setWidgetResizable (true);
            /*lance le slot charger() toute de suite apres l'affichage de la widget*/
            QTimer::singleShot(0 , this , SLOT( charger() ));
        }
     
    public slots:
        void 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];
            }
     
            /*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 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*/
             QLabel * label = new QLabel;
             label->setPixmap( QPixmap::fromImage(watcher->resultAt (index)) );
             layout->addWidget(label );
        }
     
     
     
    };
    /*qmake appliquera moc sur main.cpp*/
    #include "main.moc"
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
     
        thumbnail w;
        w.show();
        return a.exec();
    }

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 102
    Points : 53
    Points
    53
    Par défaut
    Cooool!! Merci bien... C'est génial tout ce qu'on peut faire avec Qt.
    Je regarde ça en detail demain...

    Merci encore

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

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

    Finalement, je n'ai pu regarder cela qu'aujourd'hui... Désolé...
    Quelques questions...
    A quoi sert ce include ?? :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    /*qmake appliquera moc sur main.cpp*/
    #include "main.moc"
    Je ne comprends pas bien cette ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            /*on récuper le sender du signal connecte*/
             QFutureWatcher<QImage> * watcher =static_cast< QFutureWatcher<QImage> * >(sender());
    Notamment le signal sender(). Il sort d'où et va où. Il n'est même pas défini...

    En fait j'ai essayé d'implémenter ton code dans mon programme, mais ça plante et je n'arrive pas à débugger...
    voici mon code :
    le .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
    #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 *layout;
     
        public:
            FenPrincipale();
        private:
            void creerActions();
            void creerMenus();
            QLabel *label;	
     
        private slots:
     
            void aPropos();
            //Fichier 
            void traitementImages();
            void charger();
            void afficheImageGrand(int i);
            void newImage(int index);
     
        private:
            //Fichier
            QAction *actionOuvrirRep;
            QAction *actionQuitter;
            QAction *actionAPropos;
     
    };
     
    #endif
    et le .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
    #include "FenPrincipale.h"
    #include <qtconcurrentmap.h>
     
     QImage scale(const QImage &image)
     {
         qDebug() << "Scaling image in thread" << QThread::currentThread();
         return image.scaled(QSize(100, 100), Qt::KeepAspectRatio, Qt::SmoothTransformation);
     }
     
    void FenPrincipale::traitementImages()
    {
    	    QTimer::singleShot(0 , this , SLOT( charger() ));	        
    }
     
     
    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];
        }
     
        /*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 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);
         layout->addWidget(label);
    }
     
    void FenPrincipale::afficheImageGrand(int i)
    {
         QMessageBox::information(this, "test",QVariant(i).toString());
    }
     
    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;
    }
    à la compilation j'ai ce message d'erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    affiche.cpp: In function 'void newImage(int)':
    affiche.cpp:91: error: 'sender' was not declared in this scope
    affiche.cpp:98: error: 'layout' was not declared in this scope
    /usr/local/Trolltech/Qt-4.4.1/include/QtCore/qtconcurrentmapkernel.h: In member function 'bool QtConcurrent::MappedEachKernel<Iterator, MapFunctor>::runIteration(Iterator, int, typename MapFunctor::result_type*) [with Iterator = QList<QString>::const_iterator, MapFunctor = QtConcurrent::FunctionWrapper1<QImage, const QImage&>]':
    affiche.cpp:123:   instantiated from here
    /usr/local/Trolltech/Qt-4.4.1/include/QtCore/qtconcurrentmapkernel.h:179: error: no match for call to '(QtConcurrent::FunctionWrapper1<QImage, const QImage&>) (const QString&)'
    /usr/local/Trolltech/Qt-4.4.1/include/QtCore/qtconcurrentfunctionwrappers.h:86: note: candidates are: T QtConcurrent::FunctionWrapper1<T, U>::operator()(U) [with T = QImage, U = const QImage&]
    make: *** [affiche.o] Error 1

    Merci d'avance pour ton aide...

  17. #17
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par peuf23 Voir le message
    A quoi sert ce include ?? :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    /*qmake appliquera moc sur main.cpp*/
    #include "main.moc"
    comme le dit le commentaire, cela indique à qmake que min.cpp doit être passé dans moc.

    Je ne comprends pas bien cette ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            /*on récuper le sender du signal connecte*/
             QFutureWatcher<QImage> * watcher =static_cast< QFutureWatcher<QImage> * >(sender());
    Notamment le signal sender(). Il sort d'où et va où. Il n'est même pas défini...
    sender() permet d'avoir un pointeur sur la personne qui as émit le signal
    http://qt.developpez.com/doc/4.4/qobject/#sender

    En fait j'ai essayé d'implémenter ton code dans mon programme, mais ça plante et je n'arrive pas à débugger...
    Ok je vai regarder un peu.
    SI il y as d'autre chose qui te semble obscure dans mon exemple n'hésite pas

  18. #18
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    les erreurs sont des problème de C++.
    tu déclare void newImage(int index) au lieu de void FenPrincipale::newImage(int index)

    As tu essayer de compiler et lancer mon code? p

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 102
    Points : 53
    Points
    53
    Par défaut
    Mais qu'est-ce que je peux être c..
    oui en effet j'ai oublié le FenPrincipale::

    Bon cela dit je reste avec une erreur indéterminée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    /usr/local/Trolltech/Qt-4.4.1/include/QtCore/qtconcurrentmapkernel.h: In member function 'bool QtConcurrent::MappedEachKernel<Iterator, MapFunctor>::runIteration(Iterator, int, typename MapFunctor::result_type*) [with Iterator = QList<QString>::const_iterator, MapFunctor = QtConcurrent::FunctionWrapper1<QImage, const QImage&>]':
    affiche.cpp:123:   instantiated from here
    /usr/local/Trolltech/Qt-4.4.1/include/QtCore/qtconcurrentmapkernel.h:179: error: no match for call to '(QtConcurrent::FunctionWrapper1<QImage, const QImage&>) (const QString&)'
    /usr/local/Trolltech/Qt-4.4.1/include/QtCore/qtconcurrentfunctionwrappers.h:86: note: candidates are: T QtConcurrent::FunctionWrapper1<T, U>::operator()(U) [with T = QImage, U = const QImage&]
    make: *** [affiche.o] Error 1

    oui oui, j'ai compilé et lancé ton code et cela marche nikel...

    Qu'est-ce que ca change de passer le main.cpp dans le moc? (et ça sert à quoi au juste le moc?)

    Pour le sender() ---> ok c'est clair...

  20. #20
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    regarde ta fonction scale et la mienne

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

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