<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<atom:link href="http://qtfr.org/extern.php?action=feed&amp;type=rss&amp;fid=29" rel="self" type="application/rss+xml" />
		<title><![CDATA[Forum QtFR / Trucs et astuces]]></title>
		<link>http://www.qtfr.org/index.php</link>
		<description><![CDATA[Les sujets les plus récents sur Forum QtFR.]]></description>
		<lastBuildDate>Mon, 20 May 2013 11:20:18 +0000</lastBuildDate>
		<generator>FluxBB</generator>
		<item>
			<title><![CDATA[Versionner vos projet Qt]]></title>
			<link>http://www.qtfr.org/viewtopic.php?id=13106&amp;action=new</link>
			<description><![CDATA[<p>Moi j&#039;utilise Git avec GitHub. Une fois bien réglé avec tous les raccourcis, c&#039;est hyper simple à utiliser, et tellement pratique ! Et l&#039;avantage d&#039;un dépôt en ligne est qu&#039;en cas de perte de données en local, on peut toujours les récupérer !</p><p>Quand j&#039;ai choisi GitHub, j&#039;hésitais entre ce dernier et Bitbucket (qui fait Git et Mercurial). J&#039;avais pu lire que GiHub était plus en &quot;avance&quot; que Bitbucket en matière de fonctionnalités. Et je préférais l&#039;interface de GitHub <img src="http://www.qtfr.org/plugins/ezbbc/style/smilies/smile.png" alt="smile" /> Donc voilà...<br />Mais un avantage de Bitbucket: les dépôts privé gratuits. Sur GitHub c&#039;est payant.</p>]]></description>
			<author><![CDATA[dummy@example.com (BBenj)]]></author>
			<pubDate>Mon, 20 May 2013 11:20:18 +0000</pubDate>
			<guid>http://www.qtfr.org/viewtopic.php?id=13106&amp;action=new</guid>
		</item>
		<item>
			<title><![CDATA[Utilisation basique des "resources" Qt]]></title>
			<link>http://www.qtfr.org/viewtopic.php?id=15507&amp;action=new</link>
			<description><![CDATA[<p>Attends, on ne va pas papoter ici, je vais voir ton fil.</p>]]></description>
			<author><![CDATA[dummy@example.com (PapaJaac)]]></author>
			<pubDate>Tue, 23 Apr 2013 16:08:42 +0000</pubDate>
			<guid>http://www.qtfr.org/viewtopic.php?id=15507&amp;action=new</guid>
		</item>
		<item>
			<title><![CDATA[Traduire une application Qt - principes simples]]></title>
			<link>http://www.qtfr.org/viewtopic.php?id=15685&amp;action=new</link>
			<description><![CDATA[<p>Une précision sur la gestion du pluriel par tr () :</p><p>Une boîte d&#039;alerte indiquant la fin d&#039;une opération ressemble généralement à ceci<br /><textarea name="CppCode" class="cpp">    QMessageBox::information (this, 
                              tr (&quot;Opération terminée&quot;), 
                              tr (&quot;%1 fichier(s) effacé(s)&quot;).arg (count));</textarea><br />en fonction de count, ceci affiche (en français)</p><div class="quotebox"><blockquote><div><p>10 fichier(s) effacé(s)</p></div></blockquote></div><div class="quotebox"><blockquote><div><p>0 fichier(s) effacé(s)</p></div></blockquote></div><p>et son équivalent en anglais, ce qui n&#039;est pas très esthétique.<br />De plus l&#039;anglais a une règle différente du pluriel, on écrit</p><div class="quotebox"><blockquote><div><p>0 file<strong>s</strong> deleted // seul 1 n&#039;impose pas le pluriel<br />1 file deleted<br />2 files deleted</p></div></blockquote></div><br /><p>le 3è paramètre du tr() nous permet de gérer cela élégamment. Il nous suffit de coder</p><p><textarea name="CppCode" class="cpp">tr (&quot;%1 fichier(s) effacé(s)&quot;, 0, count);</textarea><br />et linguist nous proposera de renseigner <strong>2</strong> traductions : le singulier et le pluriel. <strong>Il sera capable d&#039;appliquer tout seul les règles de chaque langue</strong><br />dans le TS français, on saisit<br />singulier : %1 fichier effacé<br />pluriel : %1 fichiers effacés</p><p>et dans le TS anglais<br />singulier : %1 file deleted<br />pluriel : %1 files deleted</p><p>Ensuite, c&#039;est Qt qui gère en fonction de count. Magique, plus de parenthèses disgracieuses dans le libellé, plus de tests sur le nombre pour savoir si count &gt; 1 ou pas, etc...</p>]]></description>
			<author><![CDATA[dummy@example.com (PapaJaac)]]></author>
			<pubDate>Thu, 18 Apr 2013 06:13:38 +0000</pubDate>
			<guid>http://www.qtfr.org/viewtopic.php?id=15685&amp;action=new</guid>
		</item>
		<item>
			<title><![CDATA[Accès fichiers]]></title>
			<link>http://www.qtfr.org/viewtopic.php?id=15506&amp;action=new</link>
			<description><![CDATA[<p>Il arrive souvent que l&#039;on veuille accéder à un fichier, image ou texte, et que pour une raison que l&#039;on ignore, ça marche pas !</p><p>Je note donc ici des habitudes qui pourrai vous faire gagner du temps.<br />Les principales raison qui peuvent empêcher un accès à un fichier sont, soit qu&#039;il n&#039;est pas placé au bon endroit, ou que le chemin indiqué n&#039;est pas le bon, ou encore que vous avez mal noté le nom du fichier (ou son extension), ou bien que vous n&#039;avez pas suffisamment de droit sur celui ci.</p><p>Il y a une différence fondamentale entre Windows et les unix-like (Linux, MacOS et autres) : dans le premier l&#039;utilisateur a le droit d&#039;écrire/modifier/supprimer à peu près partout, dans les autres il ne peut le faire que chez lui et dans le répertoire temporaire<br />C&#039;est important à retenir quand on porte une appli de Win vers un &quot;unix&quot;, tandis que les devs qui portent dans l&#039;autre sens n&#039;ont pas ce souci parce qu&#039;ils sont obligés de respecter ces 3 règles :<br />1/ toujours travailler sur des chemins complets. TOUJOURS ! ne pas supposer a priori où QFile (&quot;toto.txt&quot;) va écrire ou lire toto. Si ça se trouve, c&#039;est le répertoire de l&#039;appli, et elle peut très bien s&#039;exécuter (quand elle est installée) dans un répertoire système genre /usr/share/monappli ou autre, qui est en lecture seule.<br />2/ Le séparateur de répertoires dans Qt est le slash (<strong>/</strong>) dans tous les systèmes. Exemples de chemins complets de dossiers Images :<br /><strong>&quot;C:/Documents and Settings/papajaac/Mes documents/Mes images&quot;</strong> sous Windows<br /><strong>&quot;/home/papajaac/Images&quot;</strong> sous Linux<br />3/ Les chemins (complets) ne doivent pas être écrits en dur dans le code, excepté les ressources. Utiliser systématiquement QDir::homePath ou QDir::tempPath... et/ou <br />QString QDesktopServices::storageLocation ( StandardLocation type ) [static]&#160; </p><p>Ces fonctions retournent des chemins complets où l&#039;utilisateur qui exécute l&#039;appli a le droit d&#039;écrire, quel que soit le système.<br />Attention au fait que les QString retournées ne comportent pas de &#039;/&#039; final. Penser à le rajouter quand on y accole un nom de fichier <br /><textarea name="CppCode" class="cpp">QString monCheminComplet = QDir::homePath () + &#039;/&#039; + etc...  </textarea><br />N.B. : dans Qt 5 c&#039;est la classe QStandardPaths qui remplace et améliore QDesktopServices</p><p>Pour palier à un probleme de droit, vous pouvez affecter ceci a votre fichier:<br /><textarea name="CppCode" class="cpp">QFile file(QApplication::applicationDirPath()+&quot;/toto.txt&quot;);
file.setPermissions(QFile::WriteOther);  </textarea><br />La deuxieme ligne vous donne les droits d&#039;écriture (et donc de lecture) sur le fichier.<br />Pour d’expérience avoir perdu du temps stupide sur ce genre de problème, je le met systématiquement.</p><p>Vous vous dites probablement &quot;Nan mais je suis sur de moi j&#039;ai les droits dessus&quot; ... Jusqu&#039;au jour où vous aller poster sur ce forum en disant, &quot;Je comprend pas ça marche pas !&quot;.<br />L&#039;intelligence d&#039;une machine ce limite à celle qu&#039;on lui donne <img src="http://www.qtfr.org/plugins/ezbbc/style/smilies/wink.png" alt="wink" /></p><br /><p><em>Poste réalisé avec PapaJaac.</em></p>]]></description>
			<author><![CDATA[dummy@example.com (Loarwenn)]]></author>
			<pubDate>Fri, 15 Mar 2013 08:47:03 +0000</pubDate>
			<guid>http://www.qtfr.org/viewtopic.php?id=15506&amp;action=new</guid>
		</item>
		<item>
			<title><![CDATA[Déploiement d'une application.]]></title>
			<link>http://www.qtfr.org/viewtopic.php?id=15464&amp;action=new</link>
			<description><![CDATA[<p>Bonjour/Bonsoir à tous.<br />Petite astuce sur le déploiement d&#039;application compilée avec Visual Studio avec une machine sous Windows 8 64 bits.<br />C&#039;est aussi applicable pour n&#039;importe quel Win64. L&#039;installation des vcredist, framework.net et je ne sais quoi n&#039;est pas obligatoire. En fait le nombre de dll à livrer avec l&#039;application est assez faible.<br />Voyons donc la liste exhaustive de ces librairies qu&#039;il faut déployer :<br />* Les dll Qt naturellement. Leur nombre dépend tout simplement de ce que vous avez mis dans votre .pro au niveau de la variable QT. Au minima, dixit la doc de qmake, core et gui sauf si vous avez délibérément retiré gui,<br />* Quelques plugins genre imageformats, drivers présents dans le répertoire plugins de votre installation de Qt : donc créer le répertoire du même nom à la racine de votre application et y copier les fichiers nécessaires,<br />* Les dll externes (persos ou non),<br />* vos plugins persos s&#039;il y en a,<br />* Et maintenant les dll de Visual Studio sur lesquels j&#039;ai passé un certain temps car dénué de toute logique, tenez vous bien :<br />&#160; &#160; &#160; &#160; &#160; &#160; &#160;* pour msvc2010, les 2 dll sont msvcp100.dll et msvcr100.dll<br />&#160; &#160; &#160; &#160; &#160; &#160; &#160;* pour msvc2012, les 2 dll sont msvcp110.dll et msvcr110.dll<br />&#160; &#160; &#160; &#160; &#160; &#160; &#160;Jusque là pas de problème me diriez-vous, et je vous laisse deviner le nom des dll pour des versions antérieures de Visual Studio.<br />C&#039;est maintenant le plus passionnant. Je rappelle que nous sommes sur une machine 64 bits.<br />- Pour une compilation de votre application en 64 bits, les 2 dll msvcX.dll se trouvent dans c:\windows\system32.<br />- Pour une compilation de votre application en 32 bits, les 2 dll msvcX.dll se trouvent dans c:\windows\systemWoW64.<br />Ne cherchez pas, je n&#039;ai pas fait de faute de frappe. Voilà, cela m&#039;a fait perdre une demi journée, ne comprenant pas pourquoi mes applications criaient à l&#039;exécution des insultes comme &quot;Le point d&#039;entrée...&quot;</p><p>Voilà, à bientôt pour de nouvelles aventures.</p><p>EDIT : Qui devraient arriver prochainement car je viens de finir le déploiement de mon appli sous MacOSX, et entre le framework de Qt, toutes mes libs persos ainsi que les libs tierces que j&#039;utilise, la partie n&#039;a pas été facile et pas aussi triviale qu&#039;une tambouille à la Microsoft avec des 32 et des 64 qui se mélangent.</p>]]></description>
			<author><![CDATA[dummy@example.com (babaOroms)]]></author>
			<pubDate>Wed, 06 Mar 2013 20:03:37 +0000</pubDate>
			<guid>http://www.qtfr.org/viewtopic.php?id=15464&amp;action=new</guid>
		</item>
		<item>
			<title><![CDATA[description des composants QtWebKit]]></title>
			<link>http://www.qtfr.org/viewtopic.php?id=15263&amp;action=new</link>
			<description><![CDATA[<p>bonjour, n&#039;etant pas specialiste de QT, on me demande de réaliser une doc explicative des composants QtWebKit<br />avec leur Bugs, versions etc....</p><p>quelqu&#039;un peut il me dire s&#039;il y a un lien ou je peux trouver un max d&#039;info ? bien sur j&#039;ai passé 10 jours a visiter tout les forums<br />qui en parlant certains composants sont bien expliqués mais plein d&#039;autres non.</p><p>merci pour votre aide</p>]]></description>
			<author><![CDATA[dummy@example.com (lazhar)]]></author>
			<pubDate>Mon, 21 Jan 2013 09:35:53 +0000</pubDate>
			<guid>http://www.qtfr.org/viewtopic.php?id=15263&amp;action=new</guid>
		</item>
		<item>
			<title><![CDATA[Déplacer une ligne d'un qtableWidget]]></title>
			<link>http://www.qtfr.org/viewtopic.php?id=15057&amp;action=new</link>
			<description><![CDATA[<p>Hello,<br />Le glisser / deplacer est possible sur un QTableWidget (QHeaderView::setMovable ). En quoi est ce different ?</p>]]></description>
			<author><![CDATA[dummy@example.com (refracto)]]></author>
			<pubDate>Mon, 19 Nov 2012 13:51:41 +0000</pubDate>
			<guid>http://www.qtfr.org/viewtopic.php?id=15057&amp;action=new</guid>
		</item>
		<item>
			<title><![CDATA[[QtCreator] Les Macros, c'est trop bien !]]></title>
			<link>http://www.qtfr.org/viewtopic.php?id=14140&amp;action=new</link>
			<description><![CDATA[<p>Bonjour !</p><p>Chez moi (Mandriva Linux, dernière version de Qt-Creator) les macros n&#039;ont jamais fonctionné. <img src="http://www.qtfr.org/plugins/ezbbc/style/smilies/sad.png" alt="sad" /><br />J&#039;aime bien l&#039;éditeur pour ses liens avec l&#039;aide et sa navigation entre déclaration et initialisation, etc... mais c&#039;est vrai que lorsqu&#039;on voit la vidéo de Sublime ça fait envie...</p><p>arrêtez avec vi sinon je vous sors edline des cartons, moi...</p>]]></description>
			<author><![CDATA[dummy@example.com (PapaJaac)]]></author>
			<pubDate>Wed, 17 Oct 2012 10:57:45 +0000</pubDate>
			<guid>http://www.qtfr.org/viewtopic.php?id=14140&amp;action=new</guid>
		</item>
		<item>
			<title><![CDATA[Ajouter un timer aux requêtes sur le reseau]]></title>
			<link>http://www.qtfr.org/viewtopic.php?id=14704&amp;action=new</link>
			<description><![CDATA[<p>Lors de l&#039;utilisation de QNetworkRequest et QNetworkAccessManager, on a souvent besoin de savoir si notre requête échoue ou non (si quelqu&#039;un répond en face). Le timout par défaut est très long (de l&#039;ordre de grandeur du temps de recherche du navigateur quand il ne trouve pas une page).</p><p>Si on veut pouvoir réagir plus vite, il faut alors gérer manuellement via un QTimer le timout des requêtes. Dans le cas où l&#039;on émet plusieurs requêtes à la suite, cela peut vite devenir compliqué à maintenir (il faut un timer pour chaque requête...)</p><p>Ci dessous une petite &quot;helper class&quot; pour ce cas d&#039;utilisation, encapsule la QNetworkReply et la stoppe si elle n&#039;a pas répondu après un certain temps.<br />Vos commentaires et améliorations sont les bienvenus <img src="http://www.qtfr.org/plugins/ezbbc/style/smilies/smile.png" alt="smile" /></p><p>NetworkReplyTimer.h<br /><textarea name="CppCode" class="cpp">/**
 * @brief The NetworkReplyTimer class abort request after timout occured.
 * Timer is reset each time data is uploaded or downloaded so it works for long running time request as well.
 * NetworkReplyTimer will take care of deleting the reply when it is finished using deletelater, unless you set deleteReply to false.
 * NetworkReplyTimer object will also delete itself when receiving the finished signal.
 * timeout() signal is emitted if the request timeout and is aborted.
 */
class NetworkReplyTimer : public QObject
{
    Q_OBJECT
public:
    explicit NetworkReplyTimer(QNetworkReply* reply, int timout, bool deleteReply = true);
    
signals:
    void timeout();
    
private slots:
    void onTimeout();
    void onRequestFinished();
    
private:
    QTimer* m_timer;
    QNetworkReply* m_reply;
    bool m_deleteReply;
};</textarea></p><p>NetworkReplyTimer.cpp<br /><textarea name="CppCode" class="cpp">#include &quot;NetworkReplyTimer.h&quot;

#include &lt;QNetworkReply&gt;
#include &lt;QTimer&gt;

NetworkReplyTimer::NetworkReplyTimer(QNetworkReply *reply, int timout, bool deleteReply) :
    QObject(),
    m_timer(new QTimer(this)),
    m_reply(reply),
    m_deleteReply(deleteReply)
{
    m_timer-&gt;setInterval(timout);
    connect(m_timer, SIGNAL(timeout()), this, SLOT(onTimeout()));

    connect(reply, SIGNAL(uploadProgress(qint64,qint64)), m_timer, SLOT(start()));
    connect(reply, SIGNAL(downloadProgress(qint64,qint64)), m_timer, SLOT(start()));
    connect(reply, SIGNAL(finished()), this, SLOT(onRequestFinished()));

    m_timer-&gt;start();
}

void NetworkReplyTimer::onTimeout()
{
    m_reply-&gt;abort();
    emit timeout();
}

void NetworkReplyTimer::onRequestFinished()
{
    m_timer-&gt;stop();

    // Delete request if required
    if (m_deleteReply) m_reply-&gt;deleteLater();

    // Delete this object as well
    this-&gt;deleteLater();
}</textarea></p><p>Et un exemple d&#039;utilisation :<br /><textarea name="CppCode" class="cpp">    m_network = new QNetworkAccessManager(this);
    ....
    QNetworkRequest request(QUrl(QString(&quot;http://www.qtfr.org&quot;)));
    request.setRawHeader(...);

    // Request will be aborted after 2000ms of inactivity. Request and NetworkReplyTimer cleans up at the end of the request.
    new NetworkReplyTimer(m_network-&gt;get(request), 2000);</textarea></p>]]></description>
			<author><![CDATA[dummy@example.com (ness)]]></author>
			<pubDate>Thu, 09 Aug 2012 09:20:50 +0000</pubDate>
			<guid>http://www.qtfr.org/viewtopic.php?id=14704&amp;action=new</guid>
		</item>
		<item>
			<title><![CDATA[QMap initialisables et à usage de mise au point]]></title>
			<link>http://www.qtfr.org/viewtopic.php?id=14051&amp;action=new</link>
			<description><![CDATA[<p>Je l&#039;ai adopté dans sa version simple qui me suffit, très pratique ! <img src="http://www.qtfr.org/plugins/ezbbc/style/smilies/smile.png" alt="smile" /></p>]]></description>
			<author><![CDATA[dummy@example.com (keyga)]]></author>
			<pubDate>Mon, 28 May 2012 21:15:04 +0000</pubDate>
			<guid>http://www.qtfr.org/viewtopic.php?id=14051&amp;action=new</guid>
		</item>
		<item>
			<title><![CDATA[Comment ajouter un "espace flexible" (spacer) dans une QToolBar]]></title>
			<link>http://www.qtfr.org/viewtopic.php?id=14126&amp;action=new</link>
			<description><![CDATA[<p>Merci dergen, cela fait plaisir car avec mes &quot;testeurs&quot; nous travaillons beaucoup l&#039;ergonomie de chaque fonctionnalité.</p><p>Je vais ouvrir un ou plusieurs fils dans la présente section pour donner aux Qt-istes les méthodes pour gérer un jeu d&#039;icônes standard. <br />Linux est requis pour avoir la totale mais il y a une solution (un peu moins riche) pour Mac et Windows.</p><p>RDV ce week-end&#160; <img src="http://www.qtfr.org/plugins/ezbbc/style/smilies/wink.png" alt="wink" /></p>]]></description>
			<author><![CDATA[dummy@example.com (PapaJaac)]]></author>
			<pubDate>Fri, 04 May 2012 20:55:09 +0000</pubDate>
			<guid>http://www.qtfr.org/viewtopic.php?id=14126&amp;action=new</guid>
		</item>
		<item>
			<title><![CDATA[Tester le chemin d'un fichier pour un OS]]></title>
			<link>http://www.qtfr.org/viewtopic.php?id=13616&amp;action=new</link>
			<description><![CDATA[<p>Aurais-je réussi à produire un code parfait ?<br /><img src="http://www.qtfr.org/plugins/ezbbc/style/smilies/roll.png" alt="roll" /> ça laisse rêveur... <img src="http://www.qtfr.org/plugins/ezbbc/style/smilies/tongue.png" alt="tongue" /></p>]]></description>
			<author><![CDATA[dummy@example.com (myrddin772)]]></author>
			<pubDate>Tue, 10 Jan 2012 10:26:52 +0000</pubDate>
			<guid>http://www.qtfr.org/viewtopic.php?id=13616&amp;action=new</guid>
		</item>
		<item>
			<title><![CDATA[Partager vos connaissances !]]></title>
			<link>http://www.qtfr.org/viewtopic.php?id=13057&amp;action=new</link>
			<description><![CDATA[<p>Cette rubrique est la pour que tout le monde partage ces trucs et astuces autours de Qt !</p><p>Alors, n&#039;hésitez pas a l&#039;alimenter.</p>]]></description>
			<author><![CDATA[dummy@example.com (dergen)]]></author>
			<pubDate>Thu, 23 Jun 2011 09:10:48 +0000</pubDate>
			<guid>http://www.qtfr.org/viewtopic.php?id=13057&amp;action=new</guid>
		</item>
	</channel>
</rss>
