PDA

View Full Version : Chat client QPixmap



sgu35
23rd April 2015, 18:18
Hello,

I would like to paint an avatar on a QTextEdit using a given QPixmap, before the pseudonym and the message.

The QTextEdit will be used to see conversations between 2 or more clients.

Here is the code in relation with the problem :




// On prépare le paquet à envoyer
QByteArray paquet;
QDataStream out(&paquet, QIODevice::WriteOnly);



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 <<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





Any help will be appreciated.

yeye_olive
23rd April 2015, 23:15
How is a snippet of code serializing a couple of strings and sending them through a socket relevant to your stated objective of painting a QPixmap on a QTextEdit? And, more importantly, what is your question?

sgu35
24th April 2015, 17:55
My question is how to draw a QPixmap into a QTextEDit.

yeye_olive
24th April 2015, 18:03
Get a cursor at the right position in the QTextEdit, and use QTextCursor::insertImage(). You will first need to register the image with the resource system.

sgu35
25th April 2015, 10:05
Hello,

I succeeded to draw the image at the right position with QTextCursor like this:



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);


QPixmap pixmapbis;
QByteArray bytes;
QBuffer buffer(&bytes);
buffer.open(QIODevice::WriteOnly);
pixmapbis.save(&buffer, "PNG"); // writes pixmap into bytes in PNG format


//On remet la taille du message à 0 pour pouvoir recevoir de futurs messages
tailleMessage=0;


The point is that the tutorial (in openclassrooms) said that we had to use a QPixmap directly.
Thanks for your answer anyway.

Added after 6 minutes:

Sorry the code doesn't include the following lines :



QPixmap pixmapbis;
QByteArray bytes;
QBuffer buffer(&bytes);
buffer.open(QIODevice::WriteOnly);
pixmapbis.save(&buffer, "PNG"); // writes pixmap into bytes in PNG format



So the correct code is :



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;