Archives par mot-clé : Qt

Qt et l’héritage de QObjects

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

Le modèle objet de Qt est basé sur les QObject, qui offrent notamment le système très utile de communication inter-classes via signal / slot. Gérer l’héritage avec cette architecture peut-être de prime-abord légèrement tricky ! J’ai notamment eu quelques soucis de connexion signal / slot avec des classes héritant d’une interface (classe virtual pure).

Mon architecture

Une interface IMyClass et deux classes l’implémentant MyClass et MyClassSimulation. J’ai en prime un patron « factory » pour faciliter l’instanciation de ces classes (et pour avoir plus de souplesse dans l’avenir) : MyClassFactory.

C++ inheritance and factory

C++ inheritance and factory pattern

Je connecte alors la méthode « slot » de mon instance de IMyClass (qui est soit MyClass, soit MyClassSimulation en ait) :

connect(otherClass, SIGNAL(aSuperSignal()), myClassInstance, SLOT(myGreatMethod());

L’erreur typique

QObject::connect: Cannot connect OtherClass::aSuperSignal() to (null)::myGreatMethod()

Continuer la lecture

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

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