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 :

Opérateur >> de QPixmap

  1. #1
    Membre à l'essai
    Inscrit en
    Juillet 2007
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 36
    Points : 15
    Points
    15
    Par défaut Opérateur >> de QPixmap
    Bonjour,

    je voudrais inclure des icônes (avatars) à un logiciel de chat.
    Chaque objet client aurait un propre QPixmap.
    A chaque message posté, je voudrais afficher d'abord le QPixmap, puis le pseudo et enfin le message.

    Problème : Je ne sais pas comment utiliser l'operator<< de la classe QPixmap, ça ne veut pas afficher l'icône.

    Voici mon 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
     
     
        QByteArray paquet;
     
        QDataStream out(&paquet,QIODevice::WriteOnly);
     
        QPixmap *pixmapAvatar=new QPixmap("puzzle.png");//Pour l'exemple
     
    //On prépare le paquet à envoyer
        QString messageAEnvoyer="<strong>"+lineEditPseudo->text()+"</strong> : "+ lineEditMessage->text();
     
        out<<(quint16)0;//On écrit 0 au début du paquet pour réserver la place pour écrire la taille
     
        out<<pixmapAvatar;//Bonne position?
     
        out<<messageAEnvoyer;//On ajoute le message à la suite
     
        out.device()->seek(0);//On se replace au début du paquet
     
        out<<(quint16)(paquet.size()-sizeof(quint16));//On écrase le 0 qu'on avait réservé par la longueur du message
     
     
        socket->write(paquet);//On envoie le paquet

  2. #2
    Membre chevronné

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2013
    Messages : 610
    Points : 1 878
    Points
    1 878
    Billets dans le blog
    21
    Par défaut
    La réponse à ta question est dans la doc de Qt:

    Au sujet de l'opérateur << pour Qpixmap il est dit: "Writes the given pixmap to the given stream as a PNG image. Note that writing the stream to a file will not produce a valid image file." Il semble que la fonction save soit plus intéressante:

    "This function writes a QPixmap to the given device using the specified image file format and quality factor. This can be used, for example, to save a pixmap directly into a QByteArray"
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
            QPixmap pixmap;
            QByteArray bytes;
            QBuffer buffer(&bytes);
            buffer.open(QIODevice::WriteOnly);
            pixmap.save(&buffer, "PNG"); // writes pixmap into bytes in PNG format

    Si tu tiens à l'opérateur << , jette un coup d'oeil à la doc concernant la serialisation (http://doc.qt.io/qt-5/datastreamformat.html) en face de QIcon

  3. #3
    Membre à l'essai
    Inscrit en
    Juillet 2007
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 36
    Points : 15
    Points
    15
    Par défaut
    Bonjour stendhal666,

    j'ai mis ce que tu m'as dit dans mon 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
     
    QByteArray paquet;
    QPixmap pixmap("puzzle.png");
    QByteArray bytes;
    QBuffer buffer(&bytes);
    buffer.open(QIODevice::WriteOnly);
    pixmap.save(&buffer, "PNG"); // writes pixmap into bytes in PNG format
     
    QDataStream out(&paquet,QIODevice::WriteOnly);
     
    //On prépare le paquet à envoyer
    QString messageAEnvoyer="<strong>"+lineEditPseudo->text()+"</strong> : "+ lineEditMessage->text();
     
    out<<(quint16)0;
     
    out<<pixmap;
     
    out<<messageAEnvoyer;
     
    out.device()->seek(0);
    out<<(quint16)(paquet.size()-sizeof(quint16));
     
     
    socket->write(paquet);//On envoie le paquet
    mais ça ne marche pas, ça écrit des tas de caractères bizarres...

  4. #4
    Membre à l'essai
    Inscrit en
    Juillet 2007
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 36
    Points : 15
    Points
    15
    Par défaut
    Non, ça n'affiche rien à l'écran en fait.

  5. #5
    Membre chevronné

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2013
    Messages : 610
    Points : 1 878
    Points
    1 878
    Billets dans le blog
    21
    Par défaut
    Mmm... je ne suis pas sûr de comprendre où se situe la question de l'affichage dans ton code. Je pensais que le socket était ouvert pour une communication réseau.
    Tu peux me dire un peu plus largement ce que tu cherches à faire?

  6. #6
    Membre à l'essai
    Inscrit en
    Juillet 2007
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 36
    Points : 15
    Points
    15
    Par défaut
    Je cherche à afficher une icône à chaque message envoyé par un client. L'icône sera affichée en premier, avant le pseudo et le texte du message.

  7. #7
    Membre chevronné

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2013
    Messages : 610
    Points : 1 878
    Points
    1 878
    Billets dans le blog
    21
    Par défaut
    Ok, donc l'idée est que le paquet devrait contenir d'abord l'image, puis le message.

    J'ai regardé, tu as bien mis le code de la doc, mais après avoir sérialisé l'image tu la passes à nouveau comme si de rien n'était avec l'opérateur << ...

    Je connais pas très bien tout la bibliothèque mais tu dois chercher le moyen, après avoir sauvé le QPixmap en début du QByteArray, de chercher la fin de l'image et d'y inscrire ton message.

  8. #8
    Membre à l'essai
    Inscrit en
    Juillet 2007
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 36
    Points : 15
    Points
    15
    Par défaut
    Bonjour stendhal666,

    oui l'idée est de passer d'abord le QPixmap, d'attendre que tous les sous-paquets soient reçus puis de concaténer le pseudo et le message.

    Au fait, de quel doc parles-tu?

  9. #9
    Membre à l'essai
    Inscrit en
    Juillet 2007
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 36
    Points : 15
    Points
    15
    Par défaut
    On part d'un message envoyé par un client, le code du slot appelé quand on clique sur envoyer ou quand on tape entrée est le suivant:
    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
    void FenClient::on_pushButtonEnvoyer_clicked()
    {
    
        QPixmap pixmap("puzzle.png");
    
        QByteArray paquet;
            QDataStream out(&paquet, QIODevice::WriteOnly);
    
            // On prépare le paquet à envoyer
            QString messageAEnvoyer = "<strong>" + lineEditPseudo->text() +"</strong> : " + lineEditMessage->text();
    
            out << (quint16) 0;
            out<<pixmap;//On envoie le pixmap
            out << messageAEnvoyer;
            out.device()->seek(0);
            out << (quint16) (paquet.size() - sizeof(quint16));
    
            socket->write(paquet); // On envoie le paquet
    
            lineEditMessage->clear(); // On vide la zone d'écriture du message
            lineEditMessage->setFocus(); // Et on remet le curseur à l'intérieur
    }

  10. #10
    Membre chevronné

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2013
    Messages : 610
    Points : 1 878
    Points
    1 878
    Billets dans le blog
    21
    Par défaut
    doc = documentation de Qt à laquelle je te renvoyais!

    Dans la documentation il est bien dit qu'une image envoyée avec l'opérateur << ne donnera pas un fichier valide, et c'est pourtant ce que tu fais.
    Il faut passer par la méthode save dont je te parlais (dans un QByteArray).

    Ou bien, pour utiliser l'opérateur << , il y a des étapes à respecter pour la sérialisation d'une image:
    Si tu tiens à l'opérateur << , jette un coup d'oeil à la doc concernant la serialisation (http://doc.qt.io/qt-5/datastreamformat.html) en face de QIcon

  11. #11
    Membre à l'essai
    Inscrit en
    Juillet 2007
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 36
    Points : 15
    Points
    15
    Par défaut
    Bonjour,
    j'ai trouvé une autre solution , elle consiste à récupérer le QTextCursor du QTextEdit puis à insérer une QImage. Voici le code correspondant:

    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
     
     /*Même principe que lorsque le serveur reçoit un paquet:
        On essaie de récupérer la taille du Message
        Une fois qu'on l'a, on attend d'avoir reçu le message entier (en se basant sur la taille annooncée tailleMessage)
        */
        QDataStream in(socket);
     
        if (tailleMessage==0)//Si on ne connaît pas encore la taille du message, on essaie de la récupérer
        {
            if (socket->bytesAvailable()<(int)sizeof(quint16))//On n'a pas reçu la taille du message en entier
                return;
     
            in>>tailleMessage;//Si on a reçu la taille du message en entier, on la récupère
        }
     
        //Si on connaît la taille du message, on vérifie si on a reçu le message en entier
        if (socket->bytesAvailable()<tailleMessage)//Si on n'a pas encore tout reçu, on arrête la méthode
            return;
     
        //Si on arrive jusqu'à cette ligne, on peut récupérer le message entier
        QString messageRecu;
     
        in>>messageRecu;
     
        QPixmap pixmap("puzzle.png");
     
        QImage image(pixmap.toImage());
     
     
    //On affiche le message sur la zone de Chat
     
        QTextCursor textCursor=textEditListeMessages->textCursor();
        textEditListeMessages->append("");//Pour le saut de ligne
     
        textCursor.insertImage(image);//Colle l'avatar approprié
     
        textCursor.insertHtml(messageRecu);
     
     
     
        //On remet la taille du message à 0 pour pouvoir recevoir de futurs messages
        tailleMessage=0;
    Le hic c'est qu'on était censé d'utiliser un QPixmap comme écrit dans le cours de c++ .

Discussions similaires

  1. [Binaire] Opérateurs de rotation dee bits ?
    Par Tifauv' dans le forum C
    Réponses: 3
    Dernier message: 09/11/2017, 11h29
  2. Opérateur de statistique
    Par Phil951 dans le forum Langage SQL
    Réponses: 6
    Dernier message: 26/01/2004, 15h12
  3. Opérateur like
    Par Troopers dans le forum ASP
    Réponses: 3
    Dernier message: 15/09/2003, 19h19
  4. opérateur non applicable à ce type d'opérande
    Par Amon dans le forum Langage
    Réponses: 3
    Dernier message: 11/06/2003, 18h07
  5. [imprecis]Réaliser a^n avec seulement l'opérateur d'addition
    Par Amon dans le forum Algorithmes et structures de données
    Réponses: 18
    Dernier message: 08/11/2002, 22h22

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