Mis à jour le mardi 19 novembre 2013
  • Facile
Connectez-vous ou inscrivez-vous gratuitement pour bénéficier de toutes les fonctionnalités de ce cours !

Introduction du cours

La bibliothèque Qt est très utile et surtout très complète. Elle renferme plusieurs classes intéressantes, comme la classe QClipboard. Aujourd'hui, je vais vous montrer comment utiliser cette classe dans ce petit tutoriel. Avant d'aller plus loin, vous devez connaître la bibliothèque Qt et savoir comment faire des fenêtres avec celle-ci.

Le clipboard est très utile lorsqu'on veut stocker, déplacer ou dupliquer des données comme des images, des textes, etc. Dans certaines de vos applications, il est fort probable que vous ayez besoin de manipuler les données dans le presse-papiers. Maintenant, je vais vous montrer comment cela fonctionne. Alors commençons ! :D

Manipuler les données du clipboard

Les textes

La manipulation des données du presse-papiers est très simple avec Qt. Le bout de code qui suit stocke le texte contenu dans le clipboard dans un QString :

QClipboard *pressePapiers = QApplication::clipboard();
QString textePressePapiers = pressePapiers->text();

Maintenant, analysons les deux lignes ci-dessus l'une après l'autre.

QClipboard *pressePapiers = QApplication::clipboard();

La méthode statique clipboard() de la classe QApplication retourne un pointeur vers le presse-papiers de l'application.

QString textePressePapiers = pressePapiers->text();

La méthode text() de la classe QClipboard retourne le texte contenu dans le presse-papiers. Si vous vous rappelez le tutoriel sur Qt de M@teo21 et Nanoc, vous devriez connaître la syntaxe des accesseurs et des mutateurs avec Qt. La méthode text() est un accesseur, donc le mutateur qui change le texte contenu dans le clipboard est setText(QString text).

Oui, mais tu as dit qu'on pouvait stocker plusieurs types de données, comme des images... Ce n'est que du texte, ça ! :euh:

Patience, patience. J'allais justement répondre à votre question. ;)

Les images

Pour les images, c'est la même chose que pour le texte — sauf le nom des méthodes bien sûr. :p Mais avec Qt et le clipboard, il y a deux types d'images : le QImage et le QPixmap.

Quelle est la différence entre les deux ?

La différence, c'est que QImage est une classe qui permet un accès direct aux données des pixels de l'image, donc elle est spécialement conçue pour être peinte. Tandis que la classe QPixmap est conçue pour être affichée. Lorsque vous voulez afficher une image rapidement, utilisez QPixmap ; quand vous voulez faire des retouches sur l'image, utilisez QImage.

Comme je l'ai dit plus haut, seuls les noms et les types d'arguments diffèrent avec les images. Ce qui donne pour les accesseurs :

image() //Retourne QImage.
pixmap() //Retourne QPixmap.

Et pour les mutateurs :

setImage(QImage image)
setPixmap(QPixmap pixmap)

C'est simple, non ? ^^ Il y a aussi une méthode pour vider le contenu du presse-papiers : la méthode clear(). Elle est très facile à utiliser.

pressePapiers->clear(); //Vide le presse-papiers

Les données MIME

Dans cette sous-partie, nous allons aborder les données MIME.

Mime... Ce n'est pas une sorte de clown ?!

Bien sûr que non ! MIME est l’acronyme de Multipurpose Internet Mail Extensions.

Citation : http://fr.wikipedia.org/wiki/Multipurpose_Internet_Mail_Extensions

« Multipurpose Internet Mail Extensions (MIME) est un standard internet qui étend le format de données des courriels pour supporter des textes en différents codages de caractères autres que l'ASCII, des contenus non textuels, des contenus multiples, et des informations d'en-tête en d'autres codages que l'ASCII. »

Bref, il s'agit d'un format de données polyvalent. La classe qui contient les données MIME dans Qt est QMimeData. Le presse-papiers peut retourner un pointeur sur le QMimeData de celui-ci. Rien de plus simple :

QMimeData *mimeData = pressePapiers->mimeData();

Voilà ! :)

C'est bien beau tout ça, mais on est supposé faire quoi avec les données MIME ? o_O

Avec ces données, on peut facilement savoir si le clipboard contient du texte en format HTML, des hyperliens ou même une couleur ! Pour savoir cela, la classe QMimeData renferme de précieux testeurs. Ces testeurs retournent true si le QMimeData contient ce qu'ils testent, sinon ils retournent false.

hasText() //Pour savoir s'il contient du texte.
hasHtml() //Pour savoir s'il contient du HTML.
hasUrls() //Pour savoir s'il contient des hyperliens.
hasImage() //Pour savoir s'il contient une image.
hasColor() //Pour savoir s'il contient une couleur.

Ils sont très faciles à utiliser. Rien de mieux qu'un exemple pour démontrer leur utilité.

QClipboard *pressePapiers = QApplication::clipboard();
QMimeData *mimeData = pressePapiers->mimeData();

if(mimeData->hasText())
{
    qDebug() << "Texte"; 
}
else if(mimeData->hasHtml())
{
    qDebug() << "HTML"; 
}
else if(mimeData->hasUrls())
{
    qDebug() << "Hyperliens"; 
}
else if(mimeData->hasImage())
{
    qDebug() << "Image"; 
}
else if(mimeData->hasColor())
{
    qDebug() << "Couleur"; 
}
else
{
    qDebug() << "Données inconnues!"; 
}

Il y a les testeurs, mais il y a aussi les accesseurs et les mutateurs. Voici un exemple avec le format HTML et texte seulement :

QClipboard *pressePapiers = QApplication::clipboard();
QMimeData *mimeData = pressePapiers->mimeData();

if(mimeData->hasHtml())
{
    textEdit->setPlainText(mimeData->text()); //Met le texte contenu dans le presse-papiers dans le QTextEdit.
}
else if(mimeData->hasText())
{
    textEdit->setHtml(mimeData->html()); //Met le html contenu dans le presse-papiers dans le QTextEdit.
}

Pour les couleurs et les images c'est un peu différent, car il faut faire des casts.

QClipboard *pressePapiers = QApplication::clipboard();
QMimeData *mimeData = pressePapiers->mimeData();

if(mimeData->hasImage())
{
    QPixmap image = qvariant_cast<QPixmal>(mimeData->imageData());
    //Continuer avec l'image obtenue !
}
else if(mimeData->hasColor())
{
    QColor couleur = qvariant_cast<QColor>(mimeData->colorData());
    //Continuer avec la couleur obtenue !
}

Comme vous pouvez le constater, les données MIME sont très utiles quand il faut s'occuper du presse-papiers.

Les signaux du presse-papiers

La classe QClipboard renferme quelques signaux, mais un seul est intéressant à mon avis : le signal dataChanged. Dans cette sous-partie, je vais vous expliquer son fonctionnement.

Quand je regarde dans la documentation de la classe QClipboard, il y a quatre signaux. Pourquoi tu nous en expliques juste un ?! :euh:

La réponse est simple. Le signal findBufferChanged est seulement pour Mac OSX, et le signal selectionChanged pour les systèmes d'exploitation qui supportent les sélections (comme X11). Or Mac OSX et Windows ne supportent pas les sélections. Si ces signaux vous intéressent, vous pouvez lire la documentation. :D

dataChanged

Ce signal est vraiment simple à comprendre et à utiliser ! Il est émis lorsque les données du presse-papiers sont changées. Comme dans les autres sous-parties, je vais commencer par un exemple.

QObject::connect(pressePapiers, SIGNAL(dataChanged()), this, SLOT(pressePapiersChanger()));

.... //Un peu plus loin dans le code.

void pressePapiersChanger()
{
    qDebug() << "Les données du clipboard ont changé!";
}

Si vous ne comprenez pas cela, je vous conseille de lire les sous-parties précédentes du tutoriel et le chapitre sur les signaux et les slots du tutoriel de M@teo21 et Nanoc.

Ainsi se termine mon mini-tutoriel sur le presse-papiers avec la bibliothèque Qt. Ce n'était pas très difficile à comprendre, mais si vous avez des questions auxquelles la documentation ne répond pas, n'hésitez pas à les poser.

Exemple de certificat de réussite
Exemple de certificat de réussite