<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Qt - OnMaze le magazine spécialisé.</title>
	<atom:link href="http://qt.onmaze.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://qt.onmaze.com</link>
	<description>Just another WordPress weblog</description>
	<lastBuildDate>Wed, 24 Nov 2010 12:28:16 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.5</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Comment utiliser le module SQL de Qt</title>
		<link>http://qt.onmaze.com/tutorials/comment-utiliser-le-module-sql-de-qt/</link>
		<comments>http://qt.onmaze.com/tutorials/comment-utiliser-le-module-sql-de-qt/#comments</comments>
		<pubDate>Wed, 24 Nov 2010 09:14:39 +0000</pubDate>
		<dc:creator>philippe</dc:creator>
				<category><![CDATA[Tutoriels]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[qsqldatabase]]></category>
		<category><![CDATA[qsqlquery]]></category>
		<category><![CDATA[Qt]]></category>
		<category><![CDATA[sql]]></category>
		<category><![CDATA[sqlite]]></category>

		<guid isPermaLink="false">http://qt.onmaze.com/?p=446</guid>
		<description><![CDATA[Ce tutoriel vous montre comment utiliser le module SQL de Qt, une utilisation simple de QSqlDatabase QSqlQuery.
Cela va vous permettre de gérer une base de donnée depuis votre logiciel.


Avant de vous lancer dans le code, vérifiez que la lib correspondant à votre serveur SQL est disponible, pour cela il vous suffit d'aller dans le dossier [...]]]></description>
			<content:encoded><![CDATA[Ce tutoriel vous montre comment utiliser le module SQL de Qt, une utilisation simple de QSqlDatabase QSqlQuery.<br />
Cela va vous permettre de gérer une base de donnée depuis votre logiciel.<br />
<span id="more-446"></span>
<br />
Avant de vous lancer dans le code, vérifiez que la lib correspondant à votre serveur SQL est disponible, pour cela il vous suffit d'aller dans le dossier de Qt puis "qt/plugins/sqldrivers" et de vérifier qu'il y ai bien la lib correspondant à votre serveur<br /><br />
<code>
qsqlite4.dll -> SQLITE<br />
qsqlmysql4.dll -> MYSQL<br />
...
</code><br />
Si la lib est manquante, recompilez Qt avec les bonnes options<br /> <br />
<code>
Options de configure.exe pour MYSQL:<br />
-qt-sql-mysql -l mysql -I C:\MySQL\MySQL51\include -L C:\MySQL\MySQL51\lib\opt
</code>
Ce lien peut vous être utile <a href="http://doc.qt.nokia.com/4.7/sql-driver.html">qt 4.7 sql-driver</a>
<br />
<br />
Voilà pour ce qui est de la première partie de ce tuto :)
<br />
<br />
Rentrons maintenant dans la partie plus intéressante.
<br />
<br />
Pour ce tuto j'ai choisi d'utiliser une base de donnée SQLITE (pas de host, login, pass à rajouter dans ma GUI ^^)<br />
<br />
- Créer un nouveau projet Qt graphique.<br />
- Créer votre GUI (dans mon cas je n'ai qu'un label, une lineedit pour le nom de la base de donnée, un champ texte pour écrire ma requête, un bouton pour envoyer cette requête et un tableau qui va me permettre d'afficher mes résultats).<br />
<textarea class="cpp" name="code">
    QGridLayout     *layout;

    QLabel          *lblDBName;
    QLineEdit       *leDBName;
    QTextEdit       *teQuery;
    QPushButton     *btnSend;
    QTableWidget    *tableResult;
</textarea>
<br />
- Maintenant il faut ajouter la pièce maîtresse qui va vous permettre de vous connecter à votre base de donnée:
<textarea class="cpp" name="code">
     QSqlDatabase    SqlDB;
</textarea>
<br />
- Après avoir ajouté ces attributs à votre classe il va vous falloir un slot pour le bouton et une ou 2 méthodes histoire de ne pas tous mettre dans la même (j'en ai choisi 2):
<textarea class="cpp" name="code">
private:
    void showResult(QSqlQuery query);
    void initDB();

public slots:
    void slotSend();
</textarea>
<br />
- Vous voilà avec votre .h, il ne reste plus qu'à remplir ces methodes dans votre .cpp.
<br />
Le constructeur :
<textarea class="cpp" name="code">
Widget::Widget(QWidget *parent) : QWidget(parent)
{
    // Ajout d'un connecteur QSQLITE
    this->SqlDB         = QSqlDatabase::addDatabase("QSQLITE");

    this->layout        = new QGridLayout();
    this->lblDBName     = new QLabel("Database", this);
    this->leDBName      = new QLineEdit("main", this);
    this->teQuery       = new QTextEdit("SELECT * FROM qtsql", this);
    this->btnSend       = new QPushButton("Send", this);
    this->tableResult   = new QTableWidget(this);

    this->teQuery->setFixedHeight(50);
    this->teQuery->setFixedWidth(500);
    this->layout->cellRect(4, 2);

    this->layout->addWidget(this->lblDBName, 0, 0, 1, 1);
    this->layout->addWidget(this->leDBName, 0, 1, 1, 1);
    this->layout->addWidget(this->teQuery, 1, 0, 1, 2);
    this->layout->addWidget(this->btnSend, 2, 0, 1, 1);
    this->layout->addWidget(this->tableResult, 3, 0, 1, 2);

    this->setLayout(this->layout);

    this->connect(this->btnSend, SIGNAL(clicked()), SLOT(slotSend()));
}
</textarea>
<br />
La GUI est en place :)<br />
<br />
- La méthode initDB, appelé dans le slot du bouton, va tester la base de donnée (sqlite3 n'utilise qu'un simple fichier pour ses bases de données, si le fichier de la base de donnée n'existe pas il va être créé automatiquement) et créer une table qtsql et y rajouter des entrées:
<textarea class="cpp" name="code">
void Widget::slotSend()
{
    //Initialisation du nom de la base de donnée
    this->SqlDB.setDatabaseName(this->leDBName->text());

    this->initDB();
    ...
}
</textarea>
<textarea class="cpp" name="code">
void Widget::initDB()
{
    //Ouverture de la base de donnée
    if (!this->SqlDB.open())
    {
        QMessageBox::warning(this, "Erreur", this->SqlDB.lastError().text());
        return;
    }

    // Creation de la table qtsql
    QSqlQuery rep = this->SqlDB.exec("CREATE TABLE qtsql (id integer, name varchar(30), description varchar(250))");
    if (rep.lastError().isValid())
        return;
    ...
}
</textarea>
Il y a plusieurs manières d'ajouter des entrées dans une base de donnée:<br />
- "Binder" chaque valeurs de sa requête et exécuter les requêtes une par une:
<textarea class="cpp" name="code">
    QSqlQuery query;
    query.prepare("INSERT INTO qtsql (id, name, description) VALUES (?, ?, ?)");
    
    query.bindValue(0, 1);
    query.bindValue(1, "Bart");
    query.bindValue(2, "Fils");
    query.exec();
</textarea>
- Ou alors mettre chaque colonne dans la liste, "binder" celle-ci et faire un execBatch() qui va s'occuper de tous faire.
<textarea class="cpp" name="code">
    query.prepare("INSERT INTO qtsql VALUES (?, ?, ?)");

    QVariantList ints;
    ints << 2 << 3 << 4 << 5;
    query.addBindValue(ints);

    QVariantList names;
    names << "Lisa" << "Marge" << "Homer" << "Maggie";
    query.addBindValue(names);

    QVariantList descs;
    descs << "Fille" << "Mère" << "Père" << "Petite fille";
    query.addBindValue(descs);

    if (!query.execBatch())
        QMessageBox::warning(this, "Erreur", query.lastError().text());
</textarea>
<br />
<br />
Il ne vous reste plus qu'à exécuter la requête du QTextEdit :
<textarea class="cpp" name="code">
void Widget::slotSend()
{
    this->SqlDB.setDatabaseName(this->leDBName->text());

    this->initDB();

    // Ne pas oublier d'ouvrir la base de donnée
    if (!this->SqlDB.open())
    {
        QMessageBox::warning(this, "Erreur", this->SqlDB.lastError().text());
        return;
    }
    
    // Execution de la requete ecrite dans le QTextEdit
    QSqlQuery query = this->SqlDB.exec(this->teQuery->toPlainText());

    if (query.lastError().isValid())
    {
        QMessageBox::warning(this, "Erreur", query.lastError().text());
        this->SqlDB.close();
        return;
    }

    this->showResult(query);

    // Ne pas oublier de fermer la base de donnée
    this->SqlDB.close();
}
</textarea>
<br />
Et d'afficher son résultat dans le tableau:
<textarea class="cpp" name="code">
void Widget::showResult(QSqlQuery query)
{
    // QSqlRecord pour récupérer les headers et le nombre de colonnes
    QSqlRecord rec = query.record();

    // Initialisation du tableau
    this->tableResult->clear();
    this->tableResult->setRowCount(0);
    this->tableResult->setColumnCount(rec.count());

    QStringList lst;
    int j = 0; // colonne
    while (j < rec.count())
    {
        lst.append(rec.fieldName(j));
        j++;
    }
    // affectation des headers
    this->tableResult->setHorizontalHeaderLabels(lst);

    int i = 0; // ligne
    while (query.next()) // parcours de chaque lignes du résultat
    {
        int j = 0; // colonne
        this->tableResult->insertRow(i);
        while (j < rec.count())
        {
            QLabel *lblCol = new QLabel(query.value(j).toString());
            this->tableResult->setCellWidget(i, j, lblCol);
            j++;
        }
        i++;
    }
}
</textarea>
<br />
Voici le resultat:
<img src="http://qt.onmaze.com/wp-content/uploads/2010/11/qtsql.jpg" alt="qtsql" title="qtsql" width="376" height="361" class="aligncenter size-full wp-image-462" />
<br />
<br />
N'hesitez pas à poser des questions :)]]></content:encoded>
			<wfw:commentRss>http://qt.onmaze.com/tutorials/comment-utiliser-le-module-sql-de-qt/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<enclosure url="http://qt.onmaze.com/wp-content/uploads/2010/11/qtsql-150x150.jpg" length="" type="image/jpg" />	</item>
		<item>
		<title>Comment utiliser les QSettings partie 2/2</title>
		<link>http://qt.onmaze.com/tutorials/comment-utiliser-des-qsettings-partie-2/</link>
		<comments>http://qt.onmaze.com/tutorials/comment-utiliser-des-qsettings-partie-2/#comments</comments>
		<pubDate>Fri, 11 Jun 2010 10:45:22 +0000</pubDate>
		<dc:creator>philippe</dc:creator>
				<category><![CDATA[Tutoriels]]></category>
		<category><![CDATA[ecrire]]></category>
		<category><![CDATA[format]]></category>
		<category><![CDATA[ini]]></category>
		<category><![CDATA[lire]]></category>
		<category><![CDATA[paramètre]]></category>
		<category><![CDATA[QSettings]]></category>
		<category><![CDATA[Qt4.6]]></category>
		<category><![CDATA[settings]]></category>
		<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://qt.onmaze.com/?p=397</guid>
		<description><![CDATA[Nous avons vu dans le billet précédent comment utiliser simplement les QSettings, maintenant que nous connaissons le fonctionnement des QSettings nous allons pouvoir en faire une utilisation avancée.

Il est possible d'utiliser le format IniFormat plutôt que le format natif ou bien même de créer votre propre format d'enregistrement.

Utilisation du format IniFormat plutôt que la NativeFormat:

QSettings [...]]]></description>
			<content:encoded><![CDATA[Nous avons vu dans le <a href=" http://qt.onmaze.com/tutorials/comment-utiliser-des-qsettings-partie-1">billet précédent</a> comment utiliser simplement les QSettings, maintenant que nous connaissons le fonctionnement des QSettings nous allons pouvoir en faire une utilisation avancée.<br /><span id="more-397"></span>
<br />
Il est possible d'utiliser le format IniFormat plutôt que le format natif ou bien même de créer votre propre format d'enregistrement.<br />
<br />
<strong>Utilisation du format IniFormat plutôt que la NativeFormat:</strong>
<textarea class="cpp" name="code">
QSettings settings(QSettings::IniFormat, 
                   QSettings::UserScope, 
                   "MonEntreprise", "MonApplication");
 
</textarea>
Que se passe t'il dans ce cas la:<br />
<br />
La configuration est enregistré dans un fichier texte simple, le fichier se trouve sous Windows dans %APPDATA% (%COMMON_APPDATA% pour un SystemScope), sous Linux et MacOSX dans $HOME/.config (etc/xdg pour un SystemScope).<br />
<br />
<br />
Vous pouvez aussi définir le chemin ou enregistrer votre fichier:
<textarea class="cpp" name="code">
QSettings settings("/chemin/ou/je/veux/mon/fichier.ini",
                   QSettings::IniFormat);
 
</textarea>
<br />
<strong>Maintenant si on veux utiliser notre propre format d'enregistrement voici la procédure:</strong><br />
<br />
- tous d'abord il faut déclarer deux fonctions qui vont permettre de lire et d'écrire le fichier de configuration:<br />
<br />
ces méthodes prennent en premier paramètre le device ou écrire ou lire le fichier, et en 2ème paramètre la map à écrire dans le fichier ou à remplir lorsqu'on li le fichier.<br />
Le type SettingsMap n'est qu'autre que QMap<QString, QVariant>
<textarea class="cpp" name="code">
bool lireFichierXml(QIODevice &#038;device, 
                    QSettings::SettingsMap &#038;map);
bool ecrireFichierXml(QIODevice &#038;device, 
                      const QSettings::SettingsMap &#038;map);
</textarea>
<br />
- Après avoir déclaré ses méthodes il vous suffit de register le nouveau format:<br />
<br />
le premier paramètre est l'extension du fichier sans le "." puis forcement la fonction lire et la fonction écrire en 2ème et 3ème paramètre
<textarea class="cpp" name="code">
const QSettings::Format XmlFormat =
                   QSettings::registerFormat("xml", 
                                             lireFichierXml, 
                                             ecrireFichierXml);

QSettings settings(XmlFormat, QSettings::UserScope, 
                   "MonEntreprise", "MonApplication");
</textarea>
<br />
- Il ne vous reste plus qu'a coder les 2 fonctions de lecture et écriture du fichier xml. (Un billet sera écrit pour vous expliquer comment lire et écrire dans un fichier xml)<br />
(Petite information complémentaire: les clés de SettingsMap sont sous la forme "mongroupe/macle")<br />
<br />
N'hésitez pas à poser vos questions en commentaire.<br />
<br />]]></content:encoded>
			<wfw:commentRss>http://qt.onmaze.com/tutorials/comment-utiliser-des-qsettings-partie-2/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Comment utiliser des QSettings partie 1/2</title>
		<link>http://qt.onmaze.com/tutorials/comment-utiliser-des-qsettings-partie-1/</link>
		<comments>http://qt.onmaze.com/tutorials/comment-utiliser-des-qsettings-partie-1/#comments</comments>
		<pubDate>Fri, 11 Jun 2010 10:41:46 +0000</pubDate>
		<dc:creator>philippe</dc:creator>
				<category><![CDATA[Tutoriels]]></category>
		<category><![CDATA[base de registre]]></category>
		<category><![CDATA[configuration]]></category>
		<category><![CDATA[ini]]></category>
		<category><![CDATA[paramètre]]></category>
		<category><![CDATA[QCoreApplication]]></category>
		<category><![CDATA[QSettings]]></category>
		<category><![CDATA[Qt4.6]]></category>
		<category><![CDATA[settings]]></category>
		<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://qt.onmaze.com/?p=378</guid>
		<description><![CDATA[Les QSettings permettent d&#8217;enregistrer une configuration de votre application.

Sous Windows les settings vont être enregistrés dans la base de registre, sous Linux dans un simple fichier texte, et sous MacOSX dans un fichier xml.

On va commencer par faire une utilisation simple des QSettings.


/!\ ATTENTION: 
- La casse est importante
- Ne pas utiliser de &#8220;/&#8221; ou [...]]]></description>
			<content:encoded><![CDATA[Les QSettings permettent d&#8217;enregistrer une configuration de votre application.<br />
<br />
Sous Windows les settings vont être enregistrés dans la base de registre, sous Linux dans un simple fichier texte, et sous MacOSX dans un fichier xml.<br /><span id="more-378"></span>
<br />
<strong>On va commencer par faire une utilisation simple des QSettings.</strong><br />
<br />
<font color="red">
/!\ ATTENTION: <br />
- La casse est importante<br />
- Ne pas utiliser de &#8220;/&#8221; ou de &#8220;\&#8221; dans le nom des groupes ou des clés (sauf pour faire un groupe voir suite)<br />
- Les QSettings ne prennent que des valeurs simple (référence à QVariant)
</font><br />
<br />
- Tous d&#8217;abord on va commencer par définir les informations de l&#8217;application, pour ceci rien de plus simple:
<textarea class="cpp" name="code">
QCoreApplication::setOrganizationName(&#8221;MonEntreprise&#8221;);
QCoreApplication::setOrganizationDomain(&#8221;monentreprise.com&#8221;);
QCoreApplication::setApplicationName(&#8221;MonApplication&#8221;);
 
</textarea>

- Ensuite il vous suffit de créer un objet QSettings et de lui rajouter des clés/valeurs:
<textarea class="cpp" name="code">
QSettings settings;

settings.setValue(&#8221;macle&#8221;, 6);
settings.setValue(&#8221;macle2&#8243;, &#8220;mavaleur&#8221;);
QColor couleur = palette().background().color();
settings.setValue(&#8221;macle3&#8243;, couleur);
 
</textarea>
<br />
<strong>Maintenant QSettings permet aussi l&#8217;utilisation de groupes</strong>, ce qui permet de hiérarchiser son fichier de configuration:<br />
<br />
- La première méthode d&#8217;utilisation des groupes et de mettre un &#8220;/&#8221; dans la clé qui permet de séparer le groupe et la clé:
<textarea class="cpp" name="code">
QSettings settings;

settings.setValue(&#8221;mongroupe/macle&#8221;, 6);
settings.setValue(&#8221;mongroupe/macle2&#8243;, &#8220;mavaleur&#8221;);
QColor couleur = palette().background().color();
settings.setValue(&#8221;mongroupe2/macle3&#8243;, couleur);
 
</textarea>

- 2ème méthode (au cas ou vous auriez beaucoup d&#8217;informations dans un groupe):
<textarea class="cpp" name="code">
QSettings settings;

settings.beginGroup(&#8221;mongroupe&#8221;);

settings.setValue(&#8221;macle&#8221;, 6);
settings.setValue(&#8221;macle2&#8243;, &#8220;mavaleur&#8221;);
QColor couleur = palette().background().color();
settings.setValue(&#8221;macle3&#8243;, couleur);

settings.endGroup();
 
</textarea>
<br />
<br />
<strong>Maintenant que nous avons vu comment rajouter des valeurs dans le QSettings nous allons voir comment les récuperer:</strong><br />
<br />
<textarea class="cpp" name="code">
QSettings settings;

settings.beginGroup(&#8221;mongroupe&#8221;);
int cle1 = settings.value(&#8221;macle&#8221;).toInt();
QString cle2 = settings.value(&#8221;macle2&#8243;).toString();
QColor couleur = settings.value(&#8221;macle3&#8243;).value<QColor>();
settings.endGroup();
 
</textarea>
<br />
<br />
Dans la <a href="http://qt.onmaze.com/tutorials/comment-utiliser-des-qsettings-partie-2/">prochaine partie</a> de ce sujet nous allons voir comment créer son propre format d&#8217;enregistrement.<br />
<br />
N&#8217;hésitez pas à nous poser vos questions, à donner votre avis sur ce billet, et à me corriger si il y a des erreurs.<br />
<br />]]></content:encoded>
			<wfw:commentRss>http://qt.onmaze.com/tutorials/comment-utiliser-des-qsettings-partie-1/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Les Nokia bots</title>
		<link>http://qt.onmaze.com/informations/les-nokia-bots/</link>
		<comments>http://qt.onmaze.com/informations/les-nokia-bots/#comments</comments>
		<pubDate>Tue, 06 Apr 2010 10:07:56 +0000</pubDate>
		<dc:creator>salah</dc:creator>
				<category><![CDATA[Informations]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[nokia]]></category>
		<category><![CDATA[nokia bots]]></category>
		<category><![CDATA[nokia labs]]></category>
		<category><![CDATA[smartphone]]></category>
		<category><![CDATA[téléphone]]></category>

		<guid isPermaLink="false">http://qt.onmaze.com/?p=346</guid>
		<description><![CDATA[Nokia travaillait sur une fonctionnalité pour ses nouveaux smartphones qui vient d&#8217;être présentée, les Nokia Bots, ce seront pour commencer 4 applications qui essaieront d&#8217;anticiper nos usages récurrents.
Les téléphones deviennent donc &#8220;intelligents&#8221; les ingénieurs du département Nokia Beta Labs ont travaillé sur des outils capables de comprendre les habitudes des utilisateurs afin d&#8217;automatiser certaines tâches. [...]]]></description>
			<content:encoded><![CDATA[<p>Nokia travaillait sur une fonctionnalité pour ses nouveaux smartphones qui vient d&#8217;être présentée, les Nokia Bots, ce seront pour commencer 4 applications qui essaieront d&#8217;anticiper nos usages récurrents.</p>
<p>Les téléphones deviennent donc &#8220;intelligents&#8221; les ingénieurs du département Nokia Beta Labs ont travaillé sur des outils capables de comprendre les habitudes des utilisateurs afin d&#8217;automatiser certaines tâches. Le telephone pourra par exemple se mettre automatiquement en silencieux lors de votre réunion de 9h, ou encore de vous proposer par défaut le réveil aux horaires qui vous correspondent.</p>
<p><span id="more-346"></span>Découvrir les Nokia Bots en vidéo (anglais)</p>
<p><object width="532" height="323"><param name="movie" value="http://www.youtube-nocookie.com/v/xZQyPEz_H4M&#038;hl=fr_FR&#038;fs=1&#038;"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube-nocookie.com/v/xZQyPEz_H4M&#038;hl=fr_FR&#038;fs=1&#038;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="532" height="323"></embed></object></p>
<p>Si vous désirez tester ces applications rendez-vous <a href="http://betalabs.nokia.com/blog/2010/03/26/introducing-nokia-bots-add-ons-that-make-daily-routines-easier-by-learning-from-your">ici</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://qt.onmaze.com/informations/les-nokia-bots/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<enclosure url="http://qt.onmaze.com/wp-content/uploads/2010/04/bots-e1269612856488-150x150.jpg" length="" type="image/jpg" />	</item>
		<item>
		<title>Comment personnaliser l&#8217;apparence de son application Qt</title>
		<link>http://qt.onmaze.com/interface/comment-personnaliser-son-application-qt/</link>
		<comments>http://qt.onmaze.com/interface/comment-personnaliser-son-application-qt/#comments</comments>
		<pubDate>Thu, 04 Mar 2010 10:17:58 +0000</pubDate>
		<dc:creator>philippe</dc:creator>
				<category><![CDATA[Interface]]></category>
		<category><![CDATA[Tutoriels]]></category>
		<category><![CDATA[apparence]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[feuille de style]]></category>
		<category><![CDATA[personnaliser]]></category>
		<category><![CDATA[QApplication]]></category>
		<category><![CDATA[QPushButton]]></category>
		<category><![CDATA[Qt]]></category>
		<category><![CDATA[QWidget]]></category>
		<category><![CDATA[setStyleSheet]]></category>
		<category><![CDATA[stylesheet]]></category>

		<guid isPermaLink="false">http://qt.onmaze.com/?p=301</guid>
		<description><![CDATA[Il existe 2 méthodes pour personnaliser son application.

- La première est de personnaliser chaque widget dans votre code, plus adapté a un petit logiciel simple

- Et la deuxième de faire un fichier de style, plus pour une grosse application



Pour les personnes qui ont déjà fait du HTML/CSS ce tuto sera plus facile pour vous  [...]]]></description>
			<content:encoded><![CDATA[Il existe 2 méthodes pour personnaliser son application.<br />
<br />
- La première est de personnaliser chaque widget dans votre code, plus adapté a un petit logiciel simple<br />
<br />
- Et la deuxième de faire un fichier de style, plus pour une grosse application<br />
<br />
<span id="more-301"></span>
<br />
Pour les personnes qui ont déjà fait du HTML/CSS ce tuto sera plus facile pour vous <img src='http://qt.onmaze.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> <br />
<br />
<br />
<strong>- La première la plus simple</strong> est de faire un <em>setStyleSheet()</em> sur n&#8217;importe quel objet qui hérite de <em>QWidget</em> comme ceci:<br />
<textarea class="cpp" name="code">
QPushButton *btn = new QPushButton();
btn->setStyleSheet(&#8221;border: 0px; background-color: red;&#8221;);
</textarea>
<strong><u>Attention</u></strong> dans ce cas la le stylesheet est appliqué à tous les fils et petits fils du bouton.<br />
<br />
Donc je vous conseille vivement d&#8217;appliquer cette méthode aux objets simple comme <em>QPushButton</em> ou <em>QLineEdit</em>.<br />
<br />
<br />
<strong>- La 2ème méthode</strong> est plus complexe mais permet de personnaliser toute son application.<br />
<br />
Il s&#8217;agit simplement de mettre un stylesheet à votre <em>QApplication</em><br />
<textarea class="cpp" name="code">
void	QApplication::setStyleSheet(const QString &#038;sheet);
</textarea>
La encore vous avez la manière simple ou il suffit de faire du CSS:<br />
<textarea class="cpp" name="code">
QApplication app(ac, av);
app.setStyleSheet(&#8221;QPushButton { border:0px; background-color: red; } QLineEdit { background-color: black; }&#8221;);

return app.exec();
</textarea>
dans cet exemple tous les <em>QPushButton </em>auront le fond rouge et pas de bordure et tous les <em>QLineEdit </em>auront un fond noir. (sauf si vous remettez un setStyleSheet() identique à la toute première méthode)<br />
<br />
L&#8217;autre façon de faire se base sur le même principe mais avec du CSS plus avancé.<br />
<br />
Un petit conseil est de mettre tout son CSS dans un fichier de style et de l&#8217;inclure dans un fichier de ressources de votre projet Qt (si vous n&#8217;acceptez aucune modification de style), ou bien laisser ce fichier de style dans votre dossier.<br />
<br />
<span style="text-decoration: underline;">main.cpp</span><br />
<textarea class="cpp" name="code">
QApplication app(ac, av);

//cas du fichier inclus dans un .qrc du projet Qt
QFile styleFile(&#8221;:/styles/styles.css&#8221;);
if (!styleFile.open(QIODevice::ReadOnly))
     return -1;

QString StyleSheet(styleFile.readAll());
app.setStyleSheet(StyleSheet);

styleFile.close();

QWidget monWidget;
monWidget.show();

return app.exec();
</textarea>
<br />
<span style="text-decoration: underline;">style.css</span><br />
<textarea class="cpp" name="code">
// tous les QPushButton de l&#8217;application
QPushButton {
     border: 1px solid black;
     background-color: red;
}

// Etat secondaire d&#8217;un QPushButton
// (lorsque la souris passe sur le bouton)
// note: les états secondaires peuvent être enchainé :
// QCheckBox:hover:checked
// QRadioButton:!hover
QPushButton:hover {
     background-color: green;
}

// Sous controles,
// chaque QWidget a ses sub-controls qu&#8217;on peut personnaliser
QComboBox::down-arrow {
      image: url(down_arrow.png);
}

// tous les QPushButton fils directs
// d&#8217;un objet de type MonWidget
MonWidget > QPushButton {
     border: 0px;
     background-color: black;
     color: white;
}

// tous les QLabel fils et petits fils
// d&#8217;un objet de type MonWidget
MonWidget QLabel{
     border: 1px;
     color: red;
}

// toutes les QFrame don &#8220;objectName()&#8221; = &#8220;frameBackground&#8221;
// void setObjectName(const QString &amp;name) pour tous les QObject
QFrame#frameBackground {
     background-color: #444444;
     border: 1px solid #000000;
}
</textarea>
<br />
<br />
<img class="aligncenter size-full wp-image-330" title="tuto_stylesheet" src="http://qt.onmaze.com/wp-content/uploads/2010/03/tuto_stylesheet.png" alt="tuto_stylesheet" width="405" height="594" />
<br />
<br />
<strong><span style="text-decoration: underline;">Attention</span></strong><br />
<br />
Faites bien attention à l&#8217;ordre de votre style, par exemple ne pas faire:<br />
<textarea class="cpp" name="code">
QPushButton#okButton { color: gray }
QPushButton { color: red }
</textarea>
ici il y a un conflit: votre QPushButton nomme &#8220;okButton&#8221; prendra le style général de QPushButton car il est situé après.<br />
<br />
Ce petit lien vous sera utile: <a href="http://doc.qt.nokia.com/4.6/stylesheet-reference.html">stylesheet reference Qt 4.6</a>. Vous avez accès à la liste des QWidget personnalisable, leurs sub-controls, leurs états secondaires, etc&#8230;<br />
<br />
<br />]]></content:encoded>
			<wfw:commentRss>http://qt.onmaze.com/interface/comment-personnaliser-son-application-qt/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	<enclosure url="http://qt.onmaze.com/wp-content/uploads/2010/03/tuto_stylesheet-150x150.png" length="" type="image/jpg" />	</item>
		<item>
		<title>Meego &#8211; Nokia et Intel s&#8217;allient contre iPhone et Android</title>
		<link>http://qt.onmaze.com/informations/meego-nokia-et-intel-sallient-contre-iphone-et-android/</link>
		<comments>http://qt.onmaze.com/informations/meego-nokia-et-intel-sallient-contre-iphone-et-android/#comments</comments>
		<pubDate>Tue, 16 Feb 2010 12:39:43 +0000</pubDate>
		<dc:creator>salah</dc:creator>
				<category><![CDATA[Informations]]></category>
		<category><![CDATA[intel]]></category>
		<category><![CDATA[maemo]]></category>
		<category><![CDATA[meego]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[moblin]]></category>
		<category><![CDATA[netbook]]></category>
		<category><![CDATA[nokia]]></category>
		<category><![CDATA[Qt]]></category>
		<category><![CDATA[smartphone]]></category>
		<category><![CDATA[tablette]]></category>

		<guid isPermaLink="false">http://qt.onmaze.com/?p=287</guid>
		<description><![CDATA[Hier, lundi 15 février 2010, Intel et Nokia annonçaient un partenariat qui pouvait paraitre surprenant à première vue. Mais en y regardant de plus près cette alliance est stratégique, la fusion des deux OS mobile, Maemo de Nokia et Moblin d&#8217;Intel est le premier pas vers le développement de Meego 
une plateforme fonctionnant sur smartphone, [...]]]></description>
			<content:encoded><![CDATA[<p>Hier, lundi 15 février 2010, Intel et Nokia annonçaient un partenariat qui pouvait paraitre surprenant à première vue. Mais en y regardant de plus près cette alliance est stratégique, la fusion des deux OS mobile,<strong> Maemo de Nokia</strong> et <strong>Moblin d&#8217;Intel</strong> est le premier pas vers le développement de <a href="http://meego.com/" target="_blank">Meego </a><br />
une plateforme fonctionnant sur smartphone, netbook, tablette tactile ou encore téléviseur connecté. Symbian devrait cependant continuer à exister en parallèle de Meego.<br />
<span id="more-287"></span>Les deux constructeurs appellent les deux communautés  open source à joindre leurs forces autour de Meego. Côté technique MeeGo est basé sur Moblin et les applications seront écrites en <strong>Qt</strong> l&#8217;environnement de Maemo.</p>
<p>Le but de cette fusion est bien sur d&#8217;être en mesure de rivaliser avec l&#8217;OS d&#8217;apple qui équipe iPhone, iTouch et iPad mais aussi avec Android qui équipe de plus en plus de téléphones, smartphones et même netbooks.</p>
<p>Les premières machines pourvues de MeeGo sont attendues pour le second trimestre 2010.</p>
<p style="text-align: center;"><a href="http://qt.onmaze.com/wp-content/uploads/2010/02/meegologogm.jpg"><img class="aligncenter size-full wp-image-288" title="meegologogm" src="http://qt.onmaze.com/wp-content/uploads/2010/02/meegologogm.jpg" alt="meegologogm" width="420" height="115" /></a></p>
<p>Nous vous tiendrons bien évidemment au courant du développement de ce nouvel OS qui est une très bonne nouvelle, notamment pour les développeurs Qt. N&#8217;hésitez pas non plus à nous communiquer toute information que vous auriez en avant première.</p>
]]></content:encoded>
			<wfw:commentRss>http://qt.onmaze.com/informations/meego-nokia-et-intel-sallient-contre-iphone-et-android/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<enclosure url="http://qt.onmaze.com/wp-content/uploads/2010/02/meegologogm-150x150.jpg" length="" type="image/jpg" />	</item>
		<item>
		<title>WebKit: intégrer une page web dans votre application</title>
		<link>http://qt.onmaze.com/tutorials/webkit-integrer-une-page-web-dans-votre-application/</link>
		<comments>http://qt.onmaze.com/tutorials/webkit-integrer-une-page-web-dans-votre-application/#comments</comments>
		<pubDate>Tue, 09 Feb 2010 16:34:13 +0000</pubDate>
		<dc:creator>benoit</dc:creator>
				<category><![CDATA[Tutoriels]]></category>
		<category><![CDATA[QUrl]]></category>
		<category><![CDATA[QWebKit]]></category>
		<category><![CDATA[QWebSettings]]></category>
		<category><![CDATA[QWebView]]></category>
		<category><![CDATA[WebKit]]></category>

		<guid isPermaLink="false">http://qt.onmaze.com/?p=275</guid>
		<description><![CDATA[Depuis la version 4.4, Qt intègre WebKit, le moteur de rendu de page web utilisé par Chrome, Safari, Konqueror.

Créons pour le moment, un nouveau projet "QtWebKitTest" sans oublier de cocher certaines options:






Rajoutons une nouvelle classe MainWindow (notez la présence d'une forward déclaration):

mainwindow.h:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include 
#include 

class QWebView;

class MainWindow : public QMainWindow {
    [...]]]></description>
			<content:encoded><![CDATA[Depuis la version 4.4, Qt intègre <a href="http://www.webkit.org">WebKit</a>, le moteur de rendu de page web utilisé par <a href="http://www.google.com/chrome">Chrome</a>, <a href="http://www.apple.com/safari/">Safari</a>, <a href="http://www.konqueror.org">Konqueror</a>.

Créons pour le moment, un nouveau projet "QtWebKitTest" sans oublier de cocher certaines options:

<a href="http://qt.onmaze.com/wp-content/uploads/2010/02/Capture-d’écran-2010-02-05-à-12.20.07.png">
<img class="aligncenter size-medium wp-image-276" title="créer un projet pour utiliser webkit" src="http://qt.onmaze.com/wp-content/uploads/2010/02/Capture-d’écran-2010-02-05-à-12.20.07-300x212.png" alt="créer un projet pour utiliser webkit" width="300" height="212" /></a>

<span id="more-275"></span>

Rajoutons une nouvelle classe MainWindow (notez la présence d'une <a href="http://www-subatech.in2p3.fr/~photons/subatech/soft/carnac/CPP-INC-1.shtml">forward déclaration</a>):

<span style="text-decoration: underline;">mainwindow.h:</span>
<textarea class="cpp" name="code">
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QUrl>

class QWebView;

class MainWindow : public QMainWindow {
    Q_OBJECT
public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    QWebView            *view;
};

#endif // MAINWINDOW_H

</textarea>

<span style="text-decoration: underline;">et le mainwindow.cpp:</span>
<textarea class="cpp" name="code">
#include "mainwindow.h"
#include <QWebView>

MainWindow::MainWindow(QWidget *parent) :  QMainWindow(parent)
{
    this->view = new QWebView(this);
    this->view->load(QUrl("http://qt.onmaze.com"));
    this->setCentralWidget(this->view);
}

MainWindow::~MainWindow()
{
}
</textarea>

Ce qui nous donne au final:

<a href="http://qt.onmaze.com/wp-content/uploads/2010/02/Capture-d’écran-2010-02-05-à-12.47.43.png"><img class="aligncenter size-medium wp-image-277" title="Capture d’écran 2010-02-05 à 12.47.43" src="http://qt.onmaze.com/wp-content/uploads/2010/02/Capture-d’écran-2010-02-05-à-12.47.43-300x187.png" alt="Capture d’écran 2010-02-05 à 12.47.43" width="300" height="187" /></a>

Vous aurez sans doute besoin d'activer les extensions, notamment flash pour visualiser votre site. Pour ce faire, ajoutez dans votre main (sans oublier d'inclure &lt;QWebSettings&gt;):
<textarea class="cpp" name="code">
QWebSettings::globalSettings()-&gt;setAttribute(QWebSettings::PluginsEnabled, true);
</textarea>]]></content:encoded>
			<wfw:commentRss>http://qt.onmaze.com/tutorials/webkit-integrer-une-page-web-dans-votre-application/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<enclosure url="http://qt.onmaze.com/wp-content/uploads/2010/02/Capture-d’écran-2010-02-05-à-12.20.07-150x150.png" length="" type="image/jpg" />	</item>
		<item>
		<title>Comment utiliser les évènements</title>
		<link>http://qt.onmaze.com/interface/comment-utiliser-les-evenements/</link>
		<comments>http://qt.onmaze.com/interface/comment-utiliser-les-evenements/#comments</comments>
		<pubDate>Mon, 08 Feb 2010 14:49:52 +0000</pubDate>
		<dc:creator>philippe</dc:creator>
				<category><![CDATA[Interface]]></category>
		<category><![CDATA[Tutoriels]]></category>
		<category><![CDATA[évènements]]></category>
		<category><![CDATA[event]]></category>
		<category><![CDATA[events]]></category>
		<category><![CDATA[mouseMoveEvent]]></category>
		<category><![CDATA[mousePressEvent]]></category>
		<category><![CDATA[mouseReleaseEvent]]></category>
		<category><![CDATA[paintEvent]]></category>
		<category><![CDATA[QEvent]]></category>
		<category><![CDATA[QMouseEvent]]></category>
		<category><![CDATA[Qt]]></category>

		<guid isPermaLink="false">http://qt.onmaze.com/?p=207</guid>
		<description><![CDATA[Les évènements permettent de savoir ce qui se passe dans une application, par exemple les mouvements et clics de souris, la pression des touches, le drag and drop et d&#8217;autres (event-types).



La class abstraite QEvent est la base de ces évènements et tous les objects héritant de QWidget utilisent les évènements.

Son utilisation est simple, pour utiliser [...]]]></description>
			<content:encoded><![CDATA[Les évènements permettent de savoir ce qui se passe dans une application, par exemple les mouvements et clics de souris, la pression des touches, le drag and drop et d&#8217;autres (<a href="http://doc.trolltech.com/4.6/eventsandfilters.html#event-types">event-types</a>).
<span id="more-207"></span>
<br />
<br />
La class abstraite QEvent est la base de ces évènements et tous les objects héritant de QWidget utilisent les évènements.
<br /><br />
Son utilisation est simple, pour utiliser un évènement dans votre widget il suffit de surcharger la méthode que vous souhaitez, comme par exemple :
<textarea class="cpp" name="code">virtual void	mouseMoveEvent(QMouseEvent *event);</textarea>

Pour mon exemple j&#8217;ai choisi de changer la couleur de fond de mon widget lorsque l&#8217;utilisateur clic et bouge la souris:
<br />
<br />
<span style="text-decoration: underline;">widget.h</span>
<textarea class="cpp" name="code">
#include &lt;QWidget&gt;
#include &lt;QEvent&gt;
#include &lt;QMouseEvent&gt;
#include &lt;math.h&gt;

class myWidget : public QWidget
{
    Q_OBJECT

public:
    myWidget(QWidget *parent = 0);
    ~myWidget();

private:
    bool isPressed;
    int colorR;
    int colorG;
    int colorB;

protected:
    void mouseMoveEvent(QMouseEvent *event);
    void mousePressEvent(QMouseEvent *event);
    void mouseReleaseEvent(QMouseEvent *event);
    void paintEvent(QPaintEvent *event);
};
</textarea>
<br />
<br />
<span style="text-decoration: underline;">widget.cpp</span>
<textarea class="cpp" name="code">
#include &#8220;widget.h&#8221;

myWidget::myWidget(QWidget *parent) : QWidget(parent)
{
    // Initialisation des variables
    this->isPressed = false;
    this->setAutoFillBackground(true);
    this->colorR = 0;
    this->colorG = 0;
    this->colorB = 0;
}

myWidget::~myWidget()
{

}

void myWidget::mouseMoveEvent(QMouseEvent *event)
{
    // Si le bouton n&#8217;est pas pressé on quitte la méthode.
    if (!this->isPressed)
        return;

    // Calcul des couleurs en fonction de la
    // position de la souris dans le widget
    int ww = this->normalGeometry().width();
    int wh = this->normalGeometry().height();
    float wd = sqrt(pow(ww, 2) + pow(wh, 2)) / 2;
    int mx = event->pos().x();
    int my = event->pos().y();
    float md = sqrt(pow(mx, 2) + pow(my, 2)) / 2;

    float unitx = (float)ww / (float)255;
    float unity = (float)wh / (float)255;
    float unitd = wd / (float)255;

    this->colorR = mx / unitx;
    this->colorG = my / unity;
    this->colorB = md / unitd;

    // Vérification des couleurs (lorsque la souris sort du widget)
    if (this->colorR > 255) this->colorR = 255;
    if (this->colorG > 255) this->colorG = 255;
    if (this->colorB > 255) this->colorB = 255;
    if (this->colorR < 0) this->colorR = 0;
    if (this->colorG < 0) this->colorG = 0;
    if (this->colorB < 0) this->colorB = 0;

    // On rappel le slot pour recharger le fond
    this->repaint();
}

void myWidget::mousePressEvent(QMouseEvent *event)
{
    // le bouton est pressé
    Q_UNUSED(event);
    this->isPressed = true;
}

void myWidget::mouseReleaseEvent(QMouseEvent *event)
{
    // le bouton est relâché
    Q_UNUSED(event);
    this->isPressed = false;
}

void myWidget::paintEvent(QPaintEvent *event)
{
    // Méthode permettant de colorier le fond du widget.
    // Cette methode est appelée a chaque affichage de la fenêtre.
    QPalette palette = this->palette();
    palette.setColor(backgroundRole(), QColor(this->colorR, this->colorG, this->colorB));
    this->setPalette(palette);
}
</textarea>
<br />
<br />
Voici le résultat:
<br />
<br />
<img src="http://qt.onmaze.com/wp-content/uploads/2010/02/tuto_events.png" alt="tuto_events" title="tuto_events" width="531" height="450" class="aligncenter size-full wp-image-251" />
<br />
<br />
Les évènements vont permettre de personnaliser le comportement des widgets, mais aussi d&#8217;exécuter une tache avant la fermeture de l&#8217;application.<br />
<br />]]></content:encoded>
			<wfw:commentRss>http://qt.onmaze.com/interface/comment-utiliser-les-evenements/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<enclosure url="http://qt.onmaze.com/wp-content/uploads/2010/02/tuto_events-150x150.png" length="" type="image/jpg" />	</item>
		<item>
		<title>Ipad d&#8217;Apple, Nokia réagit.</title>
		<link>http://qt.onmaze.com/informations/ipad-dapple-nokia-reagit/</link>
		<comments>http://qt.onmaze.com/informations/ipad-dapple-nokia-reagit/#comments</comments>
		<pubDate>Sun, 31 Jan 2010 15:22:52 +0000</pubDate>
		<dc:creator>salah</dc:creator>
				<category><![CDATA[Informations]]></category>

		<guid isPermaLink="false">http://qt.onmaze.com/?p=177</guid>
		<description><![CDATA[Le PDG de Nokia, Olli-Pekka Kallasvuo, après un très bon dernier trimestre 2009 a affirmé étudier le marché et les possibilités d&#8217;un appareil à la convergence entre le PC et le téléphone. En effet après l&#8217;annonce en grande pompe de l&#8217;Ipad par Steve Jobs, tout le monde y va de sa réaction et évidemment Nokia n&#8217;y [...]]]></description>
			<content:encoded><![CDATA[<p>Le PDG de Nokia, Olli-Pekka Kallasvuo, après un <a href="http://www.gearlog.com/2010/01/will_nokia_respond_to_the_ipad.php">très bon dernier trimestre 2009</a> a affirmé étudier le marché et les possibilités d&#8217;un appareil à la convergence entre le PC et le téléphone. En effet après l&#8217;annonce en grande pompe de l&#8217;Ipad par Steve Jobs, tout le monde y va de sa réaction et évidemment Nokia n&#8217;y échappe pas.<span id="more-177"></span></p>
<p>Le constructeur Finlandais a effectivement les moyens de réagir sur ce créneau qu&#8217;APPLE tente de démocratiser avec l&#8217;iPad. Les marchés des téléphones multifonctions et des ordinateurs, notamment des ordinateurs portables, sont en train de fusionner. Avec son <a href="http://nokia-n900.fr">N900</a> par exemple NOKIA dispose déjà et depuis quelques temps d&#8217;un outil aux performances élevées disposant d&#8217;une interface tactile qui, en plus de l&#8217;iPad, permet de téléphoner et  est capable de lancer un navigateur supportant le flash.</p>
<p><a href="http://qt.onmaze.com/wp-content/uploads/2010/01/Apple-iPad.jpg"><img class="aligncenter size-full wp-image-185" title="Apple-iPad" src="http://qt.onmaze.com/wp-content/uploads/2010/01/Apple-iPad.jpg" alt="Apple-iPad" width="460" height="276" /></a></p>
<p>Autant dire que l&#8217;innovation technique d&#8217;APPLE est plutôt faible avec ce produit, celle-ci ne réside que dans la simplification à l&#8217;extrême de l&#8217;interface d&#8217;utilisation d&#8217;un ordinateur. La taille de l&#8217;écran peut aussi s&#8217;avérer être un avantage, en effet ces choix pourraient tout de même s&#8217;avérer gagnants pour APPLE, car si on réfléchit à ce qui rebute de l&#8217;informatique,un public âgé, c&#8217;est justement la complexité. Avec l&#8217;iPad pas d&#8217;installation compliquée, pas de multi-tache, pas de drivers à installer, pas de gros risques d&#8217;application malveillante, (Apple contrôle l&#8217;AppStore) et l&#8217;écran est de plus grande dimension que les téléphones que ce public a en grande partie déjà réussi à dompter.</p>
<p>Voilà pourquoi en fonction du comportement des utilisateurs face à ce nouvel outil d&#8217;APPLE, d&#8217;autres constructeurs tels que NOKIA pourraient investir ce créneau.</p>
]]></content:encoded>
			<wfw:commentRss>http://qt.onmaze.com/informations/ipad-dapple-nokia-reagit/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	<enclosure url="http://qt.onmaze.com/wp-content/uploads/2010/01/Apple-iPad-150x150.jpg" length="" type="image/jpg" />	</item>
		<item>
		<title>Comment utiliser les layouts ?</title>
		<link>http://qt.onmaze.com/interface/comment-utiliser-les-layouts/</link>
		<comments>http://qt.onmaze.com/interface/comment-utiliser-les-layouts/#comments</comments>
		<pubDate>Thu, 28 Jan 2010 10:55:05 +0000</pubDate>
		<dc:creator>philippe</dc:creator>
				<category><![CDATA[Interface]]></category>
		<category><![CDATA[Tutoriels]]></category>
		<category><![CDATA[layout]]></category>
		<category><![CDATA[QGridLayout]]></category>
		<category><![CDATA[QHBoxLayout]]></category>
		<category><![CDATA[QLayout]]></category>
		<category><![CDATA[Qt]]></category>
		<category><![CDATA[QtCreator]]></category>
		<category><![CDATA[QVBoxLayout]]></category>
		<category><![CDATA[QWidget]]></category>
		<category><![CDATA[stretch]]></category>
		<category><![CDATA[widget]]></category>

		<guid isPermaLink="false">http://qt.onmaze.com/?p=115</guid>
		<description><![CDATA[Le système de layout de Qt est simple et permet d&#8217;ordonner des boutons, des labels ou des widgets personnalisés dans un widget en utilisant tout l&#8217;espace disponible.
Le systeme de Qt inclue différents types de layout: QVBoxLayout, QHBoxlayout, QGridLayout

QVBoxLayout : est un conteneur qui va organiser les widgets verticalement. 
votrewidget.h :
private:
QVBoxLayout *vLayout;
QLabel     [...]]]></description>
			<content:encoded><![CDATA[<p>Le système de layout de Qt est simple et permet d&#8217;ordonner des boutons, des labels ou des widgets personnalisés dans un widget en utilisant tout l&#8217;espace disponible.</p>
<p>Le systeme de Qt inclue différents types de layout: <em>QVBoxLayout</em>, <em>QHBoxlayout</em>, <em>QGridLayout<span id="more-115"></span><br />
</em></p>
<p><em><strong>QVBoxLayout</strong><span style="font-style: normal;"> : est un conteneur qui va organiser les widgets verticalement<em><span style="font-style: normal;">.</span></em> </span></em></p>
<p><span style="text-decoration: underline;">votrewidget.h :</span><br />
<textarea name="code" class="cpp">private:<br />
QVBoxLayout *vLayout;<br />
QLabel      *lbl1;<br />
QLabel      *lbl2;</textarea></p>
<p><span style="text-decoration: underline;">votrewidget.cpp :</span><br />
<textarea name="code" class="cpp">Widget::Widget(QWidget *parent) : QWidget(parent)<br />
{<br />
this-&gt;vLayout = new QVBoxLayout();<br />
this-&gt;lbl1 = new QLabel(&#8221;Label 1&#8243;, this);<br />
this-&gt;vLayout-&gt;addWidget(this-&gt;lbl1);<br />
this-&gt;lbl2 = new QLabel(&#8221;Label 2&#8243;, this);<br />
this-&gt;vLayout-&gt;addWidget(this-&gt;lbl2);<br />
this-&gt;setLayout(this-&gt;vLayout);<br />
}</textarea></p>
<p><span style="text-decoration: underline;">resultat :</span></p>
<p style="text-align: center;"><img class="size-full wp-image-139 aligncenter" title="vBoxLayout" src="http://qt.onmaze.com/wp-content/uploads/2010/01/vBoxLayout.png" alt="vBoxLayout" width="132" height="100" /></p>
<p><em><strong>QHBoxLayout</strong><span style="font-style: normal;"> : est un conteneur qui va organiser les widgets horizontalement.</span></em></p>
<p><span style="text-decoration: underline;">votrewidget.h :</span><br />
<textarea name="code" class="cpp">private:<br />
QHBoxLayout *hLayout;<br />
QLabel      *lbl1;<br />
QLabel      *lbl2;</textarea></p>
<p><span style="text-decoration: underline;">votrewidget.cpp :</span><br />
<textarea name="code" class="cpp">Widget::Widget(QWidget *parent) : QWidget(parent)<br />
{<br />
this-&gt;hLayout = new QHBoxLayout();<br />
this-&gt;lbl1 = new QLabel(&#8221;Label 1&#8243;, this);<br />
this-&gt;hLayout-&gt;addWidget(this-&gt;lbl1);<br />
this-&gt;lbl2 = new QLabel(&#8221;Label 2&#8243;, this);<br />
this-&gt;hLayout-&gt;addWidget(this-&gt;lbl2);<br />
this-&gt;setLayout(this-&gt;hLayout);<br />
}</textarea></p>
<p><span style="text-decoration: underline;">resultat :</span></p>
<p style="text-align: center;"><span style="text-decoration: underline;"><img class="size-full wp-image-146 aligncenter" title="hBoxLayout" src="http://qt.onmaze.com/wp-content/uploads/2010/01/hBoxLayout.png" alt="hBoxLayout" width="132" height="77" /></span></p>
<p style="text-align: center;">
<p><em><strong>QGridLayout</strong><span style="font-style: normal;"> : est un conteneur qui va organiser les widgets sous forme de grille.</span></em></p>
<p><span style="text-decoration: underline;">votrewidget.h :</span><br />
<textarea name="code" class="cpp">private:<br />
QGridLayout *gLayout;<br />
QLabel      *lbl1;<br />
QLabel      *lbl2;</textarea></p>
<p><span style="text-decoration: underline;">votrewidget.cpp :</span><br />
<textarea name="code" class="cpp">Widget::Widget(QWidget *parent) : QWidget(parent)<br />
{<br />
this-&gt;gLayout = new QGridLayout();<br />
this-&gt;gLayout-&gt;cellRect(2, 2);<br />
this-&gt;lbl1 = new QLabel(&#8221;Label 1&#8243;, this);<br />
this-&gt;gLayout-&gt;addWidget(this-&gt;lbl1, 0, 0);<br />
this-&gt;lbl2 = new QLabel(&#8221;Label 2&#8243;, this);<br />
this-&gt;gLayout-&gt;addWidget(this-&gt;lbl2, 1, 1);<br />
this-&gt;setLayout(this-&gt;gLayout);<br />
}</textarea></p>
<p><span style="text-decoration: underline;">resultat :<img class="aligncenter size-full wp-image-157" title="gLayout" src="http://qt.onmaze.com/wp-content/uploads/2010/01/gLayout.png" alt="gLayout" width="132" height="100" /></span></p>
<p><strong><em>Stretch factor :</em></strong></p>
<p>Le stretch factor permet de définir la taille prise par une case de votre layout par rapport aux autres.</p>
<p>Lorsqu&#8217;on ajoute des widgets à un layout aucun stretch factor n&#8217;est affecté, ils partagent donc le même espace dans le layout (si les widgets n&#8217;ont pas de taille maximum ou minimum défini).</p>
<p>prenont le cas du premier exemple en rajoutant un stretch factor :</p>
<p><textarea name="code" class="cpp">Widget::Widget(QWidget *parent) : QWidget(parent)<br />
{<br />
this-&gt;vLayout = new QVBoxLayout();<br />
this-&gt;lbl1 = new QLabel(&#8221;Label 1&#8243;, this);<br />
this-&gt;vLayout-&gt;addWidget(this-&gt;lbl1, 1); // stretch factor de 1<br />
this-&gt;lbl2 = new QLabel(&#8221;Label 2&#8243;, this);<br />
this-&gt;vLayout-&gt;addWidget(this-&gt;lbl2, 2); // stretch factor de 2<br />
this-&gt;setLayout(this-&gt;vLayout);<br />
}</textarea></p>
<p><span style="text-decoration: underline;">resultat :</span></p>
<p><img class="aligncenter size-full wp-image-164" title="stretch" src="http://qt.onmaze.com/wp-content/uploads/2010/01/stretch.png" alt="stretch" width="131" height="138" /></p>
<p>Ici le label 2 prend 2 fois plus de place que le label 1, si on avait mi 4 en stretch factor il aurai pri 4 fois plus de place, de cette maniere vous pouvez gerer quelle case de votre layout doit prendre plus ou moins de place que les autres.</p>
]]></content:encoded>
			<wfw:commentRss>http://qt.onmaze.com/interface/comment-utiliser-les-layouts/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<enclosure url="http://qt.onmaze.com/wp-content/uploads/2010/01/vBoxLayout.png" length="" type="image/jpg" />	</item>
	</channel>
</rss>

