Archives de catégorie : C / C++

C, C++, le framework Qt, Arduino et tout ce qui tourne autour du langage C.

Faire un screenshot en C++ avec Qt

Publié dans C / C++ | Un commentaire

Faire un screenshot (imprim écran) en C++ à l’aide du framework Qt est étonnamment trivial. Il est très facile de « prendre en photo » tout votre écran, ou seulement une fenêtre (en connaissant son Window Id) à l’aide de la méthode grabWindow de la classe QPixmap. Un petit exemple simple pour l’écran entier (Window Id : QApplication::desktop()->winId()) que l’on enregistre dans le dossier courant en PNG.

// - Shoot the screen
QPixmap pixmap = QPixmap();
pixmap = QPixmap::grabWindow(QApplication::desktop()->winId());

// - Save this picture
QString format = "png";
QString filePath = QDir::currentPath()+"/myscreen."+format;
pixmap.save(filePath, format.toAscii());

Continuer la lecture

QMap et QHash

Publié dans C / C++ | Laisser un commentaire

Ahhh, les clés utilisées dans une QMap doivent avoir entres elles une relation d’ordre !!!

C’est ce que signifie en français courant ce gentils message d’insultes de votre compilateur :

QtCore\qmap.h:107: erreur : no match for ‘operator< ' in 'key1 < key2'

Solution au problème des QMap à clé non ordonné

  • Ajouter une relation d’ordre à vos clés :
    bool operator<(const Key other) const
    {
    	return truc < other.muche;
    }
    
  • Ou utiliser une QHash : de ce que j’ai compris, c’est pareil, sans la relation d’ordre sur les clés, et en prime c’est plus rapide !

Continuer la lecture

Javascript

JSON et C++ avec QJson

Publié dans C / C++ | Laisser un commentaire

Brut de fonderie !

Installation de QJson

Il va falloir vous débrouiller tout seul, d’ici que j’ai le temps de compléter cet article ! En attendant :

Continuer la lecture

Etendre les types gérés par un QVariant

Publié dans C / C++ | Laisser un commentaire

Par défaut, l’objet QVariant de Qt ne peut contenir que des types simples (int, short, …) et des types Qt de base (QString, …). Mais il est possible d’étendre ce comportement à des objects C++ spécifiques.
En vrac :

  • Ajouter en haut du fichier source (.cpp) où l’on a besoin d’ajouter un type spécifique dans un QVariant, ou de retrouver ce type à partie d’un QVariant:
    Q_DECLARE_METATYPE(MyType);
  • Apparemment, on peut aussi utiliser le code suivant, mais là ça devient flou pour moi:
    int myTypeId = qRegisterMetaType("MyType")
  • Ensuite, pour ajouter la donnée dans le QVariant:
    MyType myData...;
    // ...
    QVariant myVariant= QVariant::fromValue(myData);
  • Et pour la lire :
    // Le cast en (MyType) n'a pas l'air obligatoire
    MyType myRetrievedData = (MyType) myVariant.value();

That’s all folks!

Inspiration pour comprendre mieux QVariant

Interfacer C et C++ : toi aussi déguises-toi en compilo

Publié dans C / C++ | Laisser un commentaire

Code Weblog – Interfacer les langages C et C++, un autre titre pour ce très bon article sur les liens entre C et C++ pourrait être : « C et C++ : toi aussi, déguises-toi en compilo ».
Je crois que je viens de comprendre l’incroyable avantage de l’éditeur de liens !

Problèmes de mémoire ?

Petit point sur C++ et la gestion mémoire

Publié dans C / C++ | Un commentaire

Différents types de données

En terme de mémoire, il existe différents types de donnée en C++.

  • Donnée statique : emplacement alloué une fois pour toute la durée du programme
  • Donnée automatique (pile) : emplacement alloué à l’entrée d’un bloc (exemple : une fonction, une boucle, …) et libéré à sa sortie
  • Donnée dynamique (tas) : emplacement alloué et libéré à la demande du programme, donc du développeur à l’aide des opérateurs new et delete Bref à l’aide de pointeurs.

On parle ainsi de trois classes d’allocation : statique, automatique, dynamique.
Dans cet article, nous allons étudier un peu plus en détails l’allocation / destruction de données dynamiques.
Continuer la lecture

Editeur, QString et UTF-8 avec Qt

Publié dans C / C++ | Laisser un commentaire

Où comment gérer l’UTF-8 avec Qt ?

Pour l’éditeur

  • Pour tous les projets de Qt : Outils / Options / Editeurs de texte / Default Encoding et sélectionner UTF8.
  • Par projet : Projects / Paramètres de l’éditeur / Default Encoding et sélectionner UTF8.

Pour l’affichage, via un QString par exemple

  • Globalement pour tous les affichages : grâce à QTextCodec ! QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"))
  • Pour un seul QString : QString::fromUtf8(« chaine encodée en UTF-8 »)

J’ai trouvé ces informations sur le forum français de Qt.

Qt : undefined reference to vtable for …

Publié dans C / C++ | 19 commentaires

Si vous travaillez sur Qt, il vous ait peut-être déjà arrivé d’obtenir une erreur du style :

erreur : undefined reference to `vtable for’

Pourquoi a-t-on cette erreur ?

Cette erreur arrive généralement lorsque l’on souhaite utiliser « signal » et « slot » dans Qt via la méthode connect. Pour une raison ou une autre, le compilateur n’arrive pas à créer le ou les fichiers « .moc » nécessaire à ce mécanisme, et : c’est le drame !
Une autre raison peut être la non sur-définition d’une méthode dérivée alors qu’elle est déclarée virtual dans la classe parente. Là encore, même résultat: le compilateur n’arrive par à créer les fichiers « .moc ».
Voyons voir comment corriger tout ça…
Continuer la lecture

Créer plusieurs processus avec fork()

Publié dans C / C++ | 5 commentaires

Faisons une petite parenthèse sur le sujet du moment (vous ne le savez pas encore, mais j’ai quasi terminée la série jQuery et j’ai entamé une série Java EE) et allons faire un tour dans le monde merveilleux du C avec fork() et pipe() ! L’idée est de créer plusieurs processus avec fork(), d’écrire dans le pipe avec le père, et de faire lire le pipe par les processus fils, pour se rendre compte qu’un seul processus fils arrive à lire les informations !
Avant d’écrire ce billet, en plus du man pipe, et du man fork, j’ai clarifié mes idées préconçues à propos du pipe en lisant ce très bon tutoriel de Commentçamarche : Que fait un fork.
Continuer la lecture

Installer SDL avec Eclipse et MinGW

Publié dans C / C++ | 8 commentaires

Je viens de passer tout un soirée avec des zamis à essayer d’installer SDL sous Eclipse avec MinGW, et ma foi, on aura tout essayé et on aura galéré bien comme il faut. Et on n’aura rien fait d’autres… Erreur débile, comme d’hab.

Téléchargement de SDL

Tout d’abord, il faut télécharger SDL : Site de la libsdl.
Continuer la lecture