C++11 : conversions standards entre nombres et strings

Posté par seiyar81 le 26 avril 2014 | Laisser un commentaire (0)

Dans la version C++03 il n’y avait pas de façon standard de convertir des nombres en strings, il fallait passer par un stringstream.

int i = 666;
std::stringstream stream;
stream << i;
std::string s = stream.str();

Ou passer par une version template pour la conversion nombre / string ou string / nombre.

template <typename T>
std::string toString(T const & value)
{
   std::stringstream stream;
   stream << value;
   return stream.str();
}

template <typename T>
T valueOf(std::string const & text)
{
   T value;
   std::stringstream stream(text);
   stream >> value;
   return value;
}

Mais avec C++11 on dispose maintenant de fonctions standars pour effectuer ces conversions. Il suffit d’inclure le header <header>.

auto s  = std::to_string(666);
auto ws = std::to_wstring(6.66);

Fonctions qui retournent respectivement une std::string ou une std::wstring.

Et pour les conversions dans le sens string vers nombre il existe les fonctions suivantes :

  • stoi: integer signé
  • stol: long signé
  • stoll: long long signé
  • stoul: long non signé
  • stoull: long long non signé
  • stof: float
  • stod: double
  • stold: long double

Il faut retenir que ces fonctions jetent des exceptions en cas d’entrée invalide.

Catégorie: C++ | Laisser un commentaire (0)

Initialiser une std::map avec C++11

Posté par seiyar81 le 17 novembre 2013 | Laisser un commentaire (0)
C++11

Une petite astuce, si l’on peut appeler ça comme ça, sur l’utilisation des maps en C++11. Cette nouvelle version du langage a en effet introduit les initializer_list et le principe de l’uniform initialization.
Je ne détaillerai pas plus en détails les méchanismes ni les possibilités apportées par ces fonctionnaliés mais je vous conseille de vous y intéresser dans un premier temps sur Wikipédia.

Imaginons que vous disposez d’une map à initialiser sur plusieurs niveaux, voilà ce que vous pouvez maintenant faire avec les nouveaux principes évoqués ci dessus :

std::map<int, std::map<int, int>> my_map = {
    {1, 
			{
				{2, 3}
			}
		}
};

Vous gagnez ainsi de nombreuses lignes à écrire et sans y perdre en visibilité.

Catégorie: C++ | Laisser un commentaire (0)

Qt : Sauvegarder et récupérer une image dans une base de données

Posté par seiyar81 le 3 avril 2013 | Laisser un commentaire (0)

Tous les SGBD, qu’il s’agisse de bases SQL ou NoSQL, permettent de stocker des données au format binaire.

Pour les principaux : MySQL, MariaDB possèdent les types BLOB, BINARY ou VARBINARY, SQLite offre aussi un type BLOB, PostgreSQL un type BYTEA.

Il peut être utile ou nécessaire de pouvoir stocker/charger une QImage dans une base de données.

Pour la sauvegarder :


    // On ouvre la connexion à la base de données
    QSqlDatabase db = QSqlDatabase::addDatabase("QPSQL", "mybase");
    db.setHostName("localhost");
    db.setDatabaseName("mybase");
    db.setUserName("root");
    db.setPassword("");
    db.setPort(5432);

    db.open();

    QImage image("mon_image.png");
    QByteArray byteArray;
    QBuffer buffer(&byteArray);
    image.save(&buffer, "PNG");

    QSqlQuery query(db);
    query.prepare("INSERT INTO image (data) VALUES (:data)");
    query.bindValue(":data", byteArray, QSql::Binary);
    query.exec();

Pour la charger :


    QSqlQuery query(db);
    query.prepare("SELECT * FROM image WHERE id = :id");
    query.bindValue(":id", 42);

    q.exec();

    QImage image;
    QByteArray byteArray = query.value(1).toByteArray();
    QBuffer buffer(&byteArray);
    image.load(&buffer, "PNG");

Catégorie: C++, Qt | Laisser un commentaire (0)

Qt : Convertir une QImage en noir & blanc

Posté par seiyar81 le 27 décembre 2012 | Laisser un commentaire (0)

Qt, actuellement en version 4.8 et 5.0 RC2, possède un certain nombre de fonctionnalités propre aux graphismes et au dessin.
Notamment une bonne gestion des différents formats d’images comme vous pouvez le voir dans le tableau suivant :

Format Description Support de Qt
BMP Windows Bitmap Read/write
GIF Graphic Interchange Format (optional) Read
JPG Joint Photographic Experts Group Read/write
JPEG Joint Photographic Experts Group Read/write
PNG Portable Network Graphics Read/write
PBM Portable Bitmap Read
PGM Portable Graymap Read
PPM Portable Pixmap Read/write
TIFF Tagged Image File Format Read/write
XBM X11 Bitmap Read/write
XPM X11 Pixmap Read/write

S’il est possible de base de manipuler les images en changeant le mode RVB, en modifiant les pixels ou les couleurs, il faut passer par une manipulation manuelle pour convertir une image en niveaux de gris.
Pour cela rien de plus simple que la fonction suivante :

void toGrayscale(QImage & image)
{
    Q_ASSERT(!image.isNull());
    Q_ASSERT(image.width() > 0 && image.height() > 0);

    QRgb col;
    int gray;
    int width = image.width();
    int height = image.height();
    QImage alpha = image.alphaChannel(); // On sauvegarde le canal alpha pour la transparence
    for (int i = 0; i < width; ++i)
    {
        for (int j = 0; j < height; ++j)
        {
            col = image.pixel(i, j);
            gray = qGray(col);
            image.setPixel(i, j, qRgb(gray, gray, gray));
        }
    }
    image.setAlphaChannel(alpha);
}

L’opération n’est pas des plus légères puisqu’elle modifie un à un tous les pixels de l’image, toutefois elle fait ce qu’on lui demande.

Catégorie: C++, Qt | Laisser un commentaire (0)

QtBlogger : QtAmbassador et futur du projet

Posté par seiyar81 le 5 février 2012 | Laisser un commentaire (1)

Qt Ambassador

Logo QtBlogger

Cela fait plusieurs mois que le projet n’a pas avancé, on peut même dire qu’il était en pause.
Il faut dire que beaucoup d’évènements se sont enchaînés et qu’il n’a pas été facile pour moi de poursuivre les développements : déménagement, mémoire de fin d’études, entrée dans la vie active etc…

Toutefois le projet n’est pas mort ! Je compte bien poursuivre les développements et fournir un jour une première version de QtBlogger au téléchargement.

Pour rappel QtBlogger permet de gérer via une seule et même interface tous vos Blogs et CMS en s’interfaçant avec les différentes plates-formes existantes telles WordPress, Joomla, Drupal etc…
Ajoutez à cela une API permettant le développement de plugins, de nombreuses fonctionnalités présentes de base comme l’édition ou la recherche directe d’images sur le Web et vous obtenez un logiciel polyvalent.

De plus QtBlogger a eu l’honneur de rejoindre le programme QtAmbassador offert par Nokia ce qui est d’ores et déjà une première reconnaissance du travail effectué jusqu’à présent.

J’espère être en mesure de pouvoir fournir une première Beta très rapidement cela dépendra toutefois du temps que je pourrai consacrer au projet !

Catégorie: Geek, Qt, Yriase | Laisser un commentaire (1)

Ajouter un splashscreen à son application Qt

Posté par seiyar81 le 3 mai 2010 | Laisser un commentaire (0)

Qu’est-ce qu’un splashscreen ?

Sous ce nom un peu barbare se cache tout simplement cette image (ou écran) qui s’affiche au lancement d’un logiciel. Affichant dans la plupart des cas des informations sur les créateurs du logiciels ou sur le chargement en cours.
C’est là que le splashscreen prend tout son intérêt, car on peut ainsi “cacher” à l’utilisateur un temps de chargement très ou trop long ou bien le tenir au courant de l’avancement du chargement (plugins, modules etc…).

Comment ajouter un splashscreen à son application Qt ?

Qt, ce framework que nous aimons tous, possède une classe pour gérer les splashscreen : QSplashScreen.
Partons du principe que vous possédez déjà une application GUI, et que vous souhaitez rajouter un QSplashScreen. Vous devez donc avoir un code dans votre fichier main.cpp qui ressemble à peu près à ceci :

#include <QtGui/QApplication>
#include "mainwindow.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;

    /*
     Une opération longue ...
    */

    w.show();
    return a.exec();
}

C’est ici le code de base généré par QtCreator à la création d’un projet GUI. Voici le code très similaire avec l’ajout du QSplashScreen :

#include <QtGui/QApplication>
#include <QtGui/QSplashScreen>
#include "mainwindow.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;

    QSplashScreen screen;
    screen.setPixmap(QPixmap("images/splash.png"));
    screen.show();

    /*
    On simule une opération longue pour l'exemple
    */
    sleep(10);

    screen.hide();

    w.show();
    return a.exec();
}

On a juste inclus le header “#include <QtGui/QSplashScreen>” et ensuite ajouté une image à afficher.
L’opération longue est ici simulée par un sleep de 10 secondes, mais je mettrai un jour cet exemple en application avec un système de plugins.
Car oui on peut aussi créer des plugins pour son application avec Qt, mais ce sera pour une autre fois !

Catégorie: C++, Qt | Laisser un commentaire (0)

Qt 4.6 est sortie

Posté par seiyar81 le 9 décembre 2009 | Laisser un commentaire (0)


Sortie le 1er Décembre,  cette version 4.6 du framework maintenu maintenant par Nokia, apporte son lot de nouveautés intéressantes.

– Un support de Symbian OS
– Un meilleur support de Windows 7 et Mac OS 10.6
– Le support des interfaces tactiles
– Une meilleure gestion des animations grâce au projet Kinetic
– Manipulation du DOM des pages Web
– …

A télécharger d’urgence ici.

Catégorie: Qt | Laisser un commentaire (0)

Créer un éditeur de texte avec Qt 4 et QScintilla

Posté par seiyar81 le 23 novembre 2009 | Laisser un commentaire (0)
Qt

QScintilla est un portage de la librairie Scintilla vers le framework Qt permettant l’édition de texte, la coloration syntaxique, repliage du code etc…

Pour l’utiliser il vous faudra installer, si ce n’est déjà fait, le framework Qt : ici.
Puis une fois Qt installé, il faudra télécharger Qscintilla : ici.
Pour l’installer, ouvrez l’invité de commande de Qt (Qt Command Prompt), placez-vous dans le répertoire extrait et allez ensuite dans le répertoire Qt4 :

cd Qt4
qmake
make
make install
Ou sous Windows : qmake & make & make install puis
copy %QTDIR%\lib\qscintilla2.dll %QTDIR%\bin

Ceci fait, vous pouvez commencer à créer votre première application. Voici un exemple créant simplement une fenêtre avec un éditeur :

#include 
#include 
#include 

int main(int argc, char *argv[])
{
QApplication app(argc, argv);

QsciScintilla *scintilla = new QsciScintilla;
QsciLexerHTML *lexer = new QsciLexerHTML;
scintilla->setLexer(lexer);
scintilla->show();
return app.exec();
}

Compilez ce bout de code (n’oubliez pas de rajouter LIBS += -lqscintilla2 à votre .pro) et admirez le résutat^^
Pour colorier le texte QScintilla utilise des lexers, ici nous avons utilisé un QsciLexerHTML qui colore le Cobol HTML et avec le PHP, XML, ASP, Python, VBScript, Javascript et SGML.
QScintilla rassemble ainsi 29 QsciLexer pout tous les langages courants : C++, Java, C#, Perl, SQL, Fortran, D etc…

Mais le fait de seulement colorier du code n’est pas intéressant ni vraiment utile.
Heureusement pour nous QScintilla possède tout un tas de propriétés et de fonctions qui vont nous aider à mettre un place un éditeur de texte complet :

// Définit une couleur spécifique pour un élément : 
// ici red pour les tags PHPStart ('; ?>)
lexer->setColor(Qt::red, QsciLexerHTML::PHPStart);   

// Active la marge à gauche pour la numérotation des lignes 
// et lui assigne une largeur de 4 
scintilla->setMarginLineNumbers (1, true);
scintilla->setMarginWidth(1, "----");

// ‘Repliage’ du code (parentheses, crochets, 
, etc…) scintilla ->setFolding(QsciScintilla::BoxedFoldStyle); // Mise en surbrillance des parenthèses, crochets correspondants scintilla->setBraceMatching(QsciScintilla::SloppyBraceMatch); // Active l'auto-indentation scintilla->setAutoIndent(true); // Charge le contenu du fichier (ligne par ligne) comme source d'auto-complétion // Et assigne cette source à l'éditeur qui déclenchera l'auto-complétion dès que 3 caractères seront tapés QsciAPIs *api = new QSciAPIs(lexer); api->load("fichier.txt"); scintilla->setAutoCompletionSource(QsciScintilla::AcsAPIs); scintilla->setAutoCompletionThreshold(3); Etc... etc...

Pour la liste complète des méthodes et des classes de QScintilla direction la Doc.

Sachez également qu’une liste de fonctions propres aux éditeurs de texte existe. Vous pouvez donc aussi bien utiliser undo() / redo(), que indent()/ unindent(), cut() / copy() / paste(), insert() / insertAt() etc…

Bon codage !

Catégorie: Qt | Laisser un commentaire (0)

Nokia lance les certifications pour Qt

Posté par seiyar81 le 27 octobre 2009 | Laisser un commentaire (0)
Qt

Qt est un framework multi-plateforme (Windows, Linux, Mac OS) composés de plusieurs bibliothèques (ou modules) qui permettent aussi bien la programmation de GUI que la programmation réseau, l’accès aux bases de données, la manipulation de XML, la 3D avec OpenGL etc… tout cela en C++.
Ses capacités sont énormes, c’est simple : on peut tout faitre avec Qt !

Crée par la société Trolltech, rachetée récemment par Nokia, Qt est disponible sous licence LPGL, ce qui permet la création d’application propriétaires, et également sous une licence commerciale.

Utilisé par de milliers de développeurs dans le monde, de nombreux logiciels plus ou moins ‘connus’ ont été crées avec : Google Earth, KDE, Opera, Skype etc…

Développer avec Qt requiert une bonne connaissance des modules de base du framework, de son architecture, des différentes classes (histoire de ne pas être dans la doc, très bien pensée soit dit en passant, toutes les 5min).

Nokia a pensé aux développeurs avides de certifications puisqu’est disponible depuis le 1er Octobre, une certification Qt !
Comme beaucoup de certifications, on peut la passer dans les centres Person Vue, ceci pour une somme de 149€ (75€ si vous la repassez après l’avoir ratée).

Pour l’instant seule la certification Qt Essentials est disponible. Elle porte principalement sur la connaissance des modules QtCore et QtGui, consiste en un QCM de 50 questions, et est réalisable en 1h.
D’autres certifications viendront et porteront sur les autre modules de Qt.

Pour plus d’informations :

http://qt.nokia.com/developer/learning/certification
http://qt.nokia.com/developer/learning/qt-essentials-curriculum-block
http://qt.developpez.com/certification/presentation

Plus de détails quand je l’aurais passée :p

Catégorie: Qt | Laisser un commentaire (0)