﻿﻿<?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>Comment programmer avec Qt c++</title>
	<atom:link href="http://comment-apprendre.com/qt-cpp/feed" rel="self" type="application/rss+xml" />
	<link>http://comment-apprendre.com/qt-cpp</link>
	<description>Utiliser Qt - Ce que j&#039;ai appris</description>
	<lastBuildDate>Fri, 06 Jul 2012 16:11:12 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1</generator>
		<item>
		<title>Faire clignoter une fenêtre modale qui sans bordure (frameless)</title>
		<link>http://comment-apprendre.com/qt-cpp/faire-clignoter-une-fenetre-modale-qui-sans-bordure-frameless/qt-cpp</link>
		<comments>http://comment-apprendre.com/qt-cpp/faire-clignoter-une-fenetre-modale-qui-sans-bordure-frameless/qt-cpp#comments</comments>
		<pubDate>Fri, 06 Jul 2012 16:10:03 +0000</pubDate>
		<dc:creator>qt-programmer</dc:creator>
				<category><![CDATA[Qt c++]]></category>
		<category><![CDATA[clignoter]]></category>
		<category><![CDATA[fenêtre]]></category>
		<category><![CDATA[frameless]]></category>
		<category><![CDATA[modale]]></category>

		<guid isPermaLink="false">http://comment-apprendre.com/qt-cpp/?p=66</guid>
		<description><![CDATA[Quand vous appelez une fenêtre modale avec Qt, Windows se charge de faire clignoter la bordure de cette dernière. Par contre, quand elle n&#8217;a PAS de bordure (avec le flag Qt::FramelessWindowHint), rien ne se passe. Résultat ? L&#8217;utilisateur teste votre logiciel, essaie de faire autre chose après avoir ouvert une fenêtre modale en cliquant dans une<a href="http://comment-apprendre.com/qt-cpp/faire-clignoter-une-fenetre-modale-qui-sans-bordure-frameless/qt-cpp">&#160;&#160;[ Lire plus ]</a>]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fcomment-apprendre.com%2Fqt-cpp%2Ffaire-clignoter-une-fenetre-modale-qui-sans-bordure-frameless%2Fqt-cpp"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fcomment-apprendre.com%2Fqt-cpp%2Ffaire-clignoter-une-fenetre-modale-qui-sans-bordure-frameless%2Fqt-cpp&amp;source=MartinGamsby&amp;style=normal" height="61" width="50" /><br />
			</a>
		</div>
<p>Quand vous appelez une fenêtre modale avec Qt, Windows se charge de faire clignoter la bordure de cette dernière.</p>
<p>Par contre, quand elle n&#8217;a PAS de bordure (avec le flag Qt::FramelessWindowHint), rien ne se passe.</p>
<p>Résultat ?</p>
<p>L&#8217;utilisateur teste votre logiciel, essaie de faire autre chose après avoir ouvert une fenêtre modale en cliquant dans une autre fenêtre de votre application, et absolument rien ne se passe. Il pense qu&#8217;il y a un bug, ferme l&#8217;application et ne l&#8217;ouvre plus jamais parce qu&#8217;il a détesté sa première expérience.</p>
<p>Comment régler ce problème ?</p>
<p>J&#8217;ai passé énormément de temps pour une si petite chose, puisque personne n&#8217;en parle nulle part sur Internet, la documentation de Qt non plus d&#8217;ailleurs.</p>
<p>Voici comment j&#8217;ai fait.</p>
<p>Je ne dis pas que c&#8217;es la meilleure solution, mais c&#8217;est un début vers la bonne solution, mais plus important encore : elle fonctionne.</p>
<p>J&#8217;ai d&#8217;abord essayé d&#8217;installer un eventFilter dans la fenêtre modale, mais absolument aucun évènement n&#8217;est appellé quand on clique sur une autre fenêtre &#8230; bizarre &#8230;</p>
<p>Donc j&#8217;ai fait l&#8217;inverse : J&#8217;ai fait hériter toutes mes fenêtres d&#8217;une classe QMainWindow, qui capte l&#8217;évènement d&#8217;activation de fenêtre (QEvent::WindowActivate), pour ensuite vérifier si l&#8217;application a une fenêtre modale active (QApplication::activeModalWidget()). Si c&#8217;est le cas, je fais clignoter cette fenêtre modale avec un QTimer.</p>
<p>Oui je sais c&#8217;est pas très joli, mais je n&#8217;ai rien trouvé d&#8217;autre après des heures de tatonnement.</p>
<p>Par contre, pour faire les fenêtres modales, il faut faire attention pour que ce code fonctionne.</p>
<ul>
<li>D&#8217;abord, il ne faut pas qu&#8217;elle aille de parent, sans quoi le parent ne recevra pas d&#8217;évènement.</li>
<li>Ensuite, exec() et setModal(true) ne fonctionneront pas, pas plus que setWindowModality(Qt::ApplicationModal). Vous devez utiliser setWindowModality(Qt::WindowModal), avec show()</li>
<li>Pour finir, ne pas oublier que toutes vos fenêtre doivent hériter de MyMainWindow, et ne pas oublier d&#8217;installer un eventFilter, avec<br />
installEventFilter(this);<br />
dans le constructeur . Si vous l&#8217;avez déjà implémenté, n&#8217;oubliez pas de faire au moins:&nbsp;</p>
<pre>bool YourWindow::eventFilter(QObject *o, QEvent *e)
{
	return MyMainWindow::eventFilter(o, e);
}</pre>
</li>
</ul>
<p>&nbsp;</p>
<p>Voici la classe en question :</p>
<p>&nbsp;</p>
<pre>MyMainWindow::MyMainWindow( QWidget *parent, Qt::WindowFlags flags) : QMainWindow(parent, flags), nFlash(0)
{
	timer = new QTimer();
	timer-&gt;setInterval(75);
	connect(timer, SIGNAL(timeout()), SLOT(flash()));
}

MyMainWindow::~MyMainWindow()
{
	timer-&gt;stop();
	delete timer;
}

void MyMainWindow::flashWindow()
{
	if(nFlash == 0 || nFlash &gt; 5) {
		nFlash = 1;
		timer-&gt;start();
	}
}

void MyMainWindow::flash()
{
	QWidget* pWidget = QApplication::activeModalWidget();
    if (pWidget)
    {
		if(!(nFlash % 2)) {
			pWidget-&gt;setWindowOpacity(1);

			if(nFlash &gt;= 9){
				timer-&gt;stop();
				nFlash = 0;
				return;
			}
		}
		else
			pWidget-&gt;setWindowOpacity(.85);

		nFlash++;
	} else {
		timer-&gt;stop();
		nFlash = 0;
	}
}

bool MyMainWindow::eventFilter(QObject *o, QEvent *e)
{
	if(e-&gt;type() == QEvent::WindowActivate)
	{
		QWidget* pWidget = QApplication::activeModalWidget();
        if (pWidget)
        {
            pWidget-&gt;raise();
			pWidget-&gt;activateWindow();

			flashWindow(false);

			e-&gt;accept();
        }
	}
	return QMainWindow::eventFilter(o, e);
}
<pre>class MyMainWindow : public QMainWindow
{
	Q_OBJECT
public:

	MyMainWindow(QWidget *parent=0, Qt::WindowFlags flags = 0);
	~MyMainWindow();
	void flashWindow();

private slots:
	void flash();

protected:
	bool eventFilter(QObject *obj, QEvent *event);

	QTimer *timer;
	int nFlash;
};</pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>Ensuite, il n'y a qu'àQuand vous appelez une fenêtre modale avec Qt, Windows se charge de faire clignoter la bordure de cette dernière.</p>
<p>Par contre, quand elle n'a PAS de bordure (avec le flag Qt::FramelessWindowHint), rien ne se passe.</p>
<p>Résultat ?</p>
<p>L'utilisateur teste votre logiciel, essaie de faire autre chose après avoir ouvert une fenêtre modale en cliquant dans une autre fenêtre de votre application, et absolument rien ne se passe. Il pense qu'il y a un bug, ferme l'application et ne l'ouvre plus jamais parce qu'il a détesté sa première expérience.</p>
<p>Comment régler ce problème ?</p>
<p>J'ai passé énormément de temps pour une si petite chose, puisque personne n'en parle nulle part sur Internet, la documentation de Qt non plus d'ailleurs.</p>
<p>Voici comment j'ai fait.</p>
<p>Je ne dis pas que c'es la meilleure solution, mais c'est un début vers la bonne solution, mais plus important encore : elle fonctionne.</p>
<p>J'ai d'abord essayé d'installer un eventFilter dans la fenêtre modale, mais absolument aucun évènement n'est appellé quand on clique sur une autre fenêtre ... bizarre ...</p>
<p>Donc j'ai fait l'inverse : J'ai fait hériter toutes mes fenêtres d'une classe QMainWindow, qui capte l'évènement d'activation de fenêtre (QEvent::WindowActivate), pour ensuite vérifier si l'application a une fenêtre modale active (QApplication::activeModalWidget()). Si c'est le cas, je fais clignoter cette fenêtre modale avec un QTimer.</p>
<p>Oui je sais c'est pas très joli, mais je n'ai rien trouvé d'autre après des heures de tatonnement.</p>
<p>Par contre, pour faire les fenêtres modales, il faut faire attention pour que ce code fonctionne.</p>
<ul>
<li>D'abord, il ne faut pas qu'elle aille de parent, sans quoi le parent ne recevra pas d'évènement.</li>
<li>Ensuite, exec() et setModal(true) ne fonctionneront pas, pas plus que setWindowModality(Qt::ApplicationModal). Vous devez utiliser setWindowModality(Qt::WindowModal), avec show()</li>
<li>Pour finir, ne pas oublier que toutes vos fenêtre doivent hériter de</li>
</ul>
<p>Voici la classe en question :</p>
<p>&nbsp;</p>
<pre>#include "stdafx.h"
#include "RCSWidget.h"

#include
#include 

MyMainWindow::MyMainWindow( QWidget *parent, Qt::WindowFlags flags) : QMainWindow(parent, flags), nFlash(0)
{
	timer = new QTimer();
	timer-&gt;setInterval(75);
	connect(timer, SIGNAL(timeout()), SLOT(flash()));
}

MyMainWindow::~MyMainWindow()
{
	timer-&gt;stop();
	delete timer;
}

void MyMainWindow::flashWindow(bool self)
{
	if(nFlash == 0 || nFlash &gt; 5 ||  self != mFlashSelf) {
		nFlash = 1;
		mFlashSelf = self;
		timer-&gt;start();
	}
}

void MyMainWindow::flash()
{
	QWidget* pWidget = (mFlashSelf ? this : QApplication::activeModalWidget());
    if (pWidget)
    {
		if(!(nFlash % 2)) {
			pWidget-&gt;setWindowOpacity(1);

			if(nFlash &gt;= 9){
				timer-&gt;stop();
				nFlash = 0;
				return;
			}
		}
		else
			pWidget-&gt;setWindowOpacity(.85);

		nFlash++;
	} else {
		timer-&gt;stop();
		nFlash = 0;
	}
}

bool MyMainWindow::eventFilter(QObject *o, QEvent *e)
{
	if(e-&gt;type() == QEvent::WindowActivate)
	{
		QWidget* pWidget = QApplication::activeModalWidget();
        if (pWidget)
        {
            pWidget-&gt;raise();
			pWidget-&gt;activateWindow();

			flashWindow(false);

			e-&gt;accept();
        }
	}
	return QMainWindow::eventFilter(o, e);
}
<pre>#include
#include 

class RCSMainWindow : public QMainWindow
{
	Q_OBJECT
public:

	RCSMainWindow(QWidget *parent=0, Qt::WindowFlags flags = 0);
	~RCSMainWindow();
	void flashWindow();

private slots:
	void flash();

protected:
	bool eventFilter(QObject *obj, QEvent *event);

	QTimer *timer;
	int nFlash;
};</pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>Ensuite, il n'y a qu'à</pre>
<p><span style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; font-size: x-small;"><span style="line-height: 19px; white-space: normal;"> </span></span></pre>
]]></content:encoded>
			<wfw:commentRss>http://comment-apprendre.com/qt-cpp/faire-clignoter-une-fenetre-modale-qui-sans-bordure-frameless/qt-cpp/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Enregistrer l&#8217;apparence d&#8217;un widget dans un fichier</title>
		<link>http://comment-apprendre.com/qt-cpp/enregistrer-lapparence-dun-widget-dans-un-fichier/uncategorized</link>
		<comments>http://comment-apprendre.com/qt-cpp/enregistrer-lapparence-dun-widget-dans-un-fichier/uncategorized#comments</comments>
		<pubDate>Tue, 12 Jun 2012 17:38:10 +0000</pubDate>
		<dc:creator>qt-programmer</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://comment-apprendre.com/qt-cpp/?p=59</guid>
		<description><![CDATA[QImage img(ui-&#62;widget-&#62;size, QImage::Format_RGB32); QPainter painter(&#38;img); ui-&#62;widget-&#62;render(&#38;painter); fileName = QString("%1/%2") .arg(QDesktopServices::storageLocation(QDesktopServices::TempLocation)) .arg("fichierTemporaire.jpg"); img.save(fileName);]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fcomment-apprendre.com%2Fqt-cpp%2Fenregistrer-lapparence-dun-widget-dans-un-fichier%2Funcategorized"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fcomment-apprendre.com%2Fqt-cpp%2Fenregistrer-lapparence-dun-widget-dans-un-fichier%2Funcategorized&amp;source=MartinGamsby&amp;style=normal" height="61" width="50" /><br />
			</a>
		</div>
<pre>QImage img(ui-&gt;widget-&gt;size, QImage::Format_RGB32);
QPainter painter(&amp;img);
ui-&gt;widget-&gt;render(&amp;painter);

fileName = QString("%1/%2")
    .arg(QDesktopServices::storageLocation(QDesktopServices::TempLocation))
    .arg("fichierTemporaire.jpg");

img.save(fileName);</pre>
]]></content:encoded>
			<wfw:commentRss>http://comment-apprendre.com/qt-cpp/enregistrer-lapparence-dun-widget-dans-un-fichier/uncategorized/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Obtenir le padding, margin et bordure de votre widget custom</title>
		<link>http://comment-apprendre.com/qt-cpp/obtenir-le-padding-margin-et-bordure-de-votre-widget-custom/uncategorized</link>
		<comments>http://comment-apprendre.com/qt-cpp/obtenir-le-padding-margin-et-bordure-de-votre-widget-custom/uncategorized#comments</comments>
		<pubDate>Fri, 18 May 2012 20:36:27 +0000</pubDate>
		<dc:creator>qt-programmer</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://comment-apprendre.com/qt-cpp/?p=52</guid>
		<description><![CDATA[Quand vous sousclassez un QWidget pour qu&#8217;il aille des comportements différents, il peut être difficile de trouver quelle est la taille des marges, bordures, etc. Par exemple, si vous voulez sousclasser un QLineEdit pour ajuster automatiquement la taille du texte, vous pouvez trouver le rectangle où le texte est entré avec la méthode suivante :<a href="http://comment-apprendre.com/qt-cpp/obtenir-le-padding-margin-et-bordure-de-votre-widget-custom/uncategorized">&#160;&#160;[ Lire plus ]</a>]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fcomment-apprendre.com%2Fqt-cpp%2Fobtenir-le-padding-margin-et-bordure-de-votre-widget-custom%2Funcategorized"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fcomment-apprendre.com%2Fqt-cpp%2Fobtenir-le-padding-margin-et-bordure-de-votre-widget-custom%2Funcategorized&amp;source=MartinGamsby&amp;style=normal" height="61" width="50" /><br />
			</a>
		</div>
<p>Quand vous sousclassez un QWidget pour qu&#8217;il aille des comportements différents, il peut être difficile de trouver quelle est la taille des marges, bordures, etc.</p>
<p>Par exemple, si vous voulez sousclasser un QLineEdit pour ajuster automatiquement la taille du texte, vous pouvez trouver le rectangle où le texte est entré avec la méthode suivante : QWidget::contentsRect();</p>
<p>J&#8217;ai fait, par exemple, pour ajuster la taille du texte entré :</p>
<p>&nbsp;</p>
<p><code>void QMyLineEdit::onTextChanged ( const QString &amp; text ) {</code></p>
<p><code>if(mMaxFontSize == -1)<br />
mMaxFontSize = font().pixelSize();// in the constructor the pixelSize is -1</code></p>
<p><code> </code></p>
<p><code>QFont tmpFont = QFont(font());<br />
tmpFont.setPixelSize(mMaxFontSize);</code></p>
<p><code>while(tmpFont.pixelSize() &gt;= mMinFontSize &amp;&amp; contentsRect().width() &lt; QFontMetrics(tmpFont).width(QString(" %1 ").arg(text))) {<br />
tmpFont.setPixelSize(tmpFont.pixelSize() - 1);<br />
}<br />
setFont(tmpFont);<br />
}</code></p>
]]></content:encoded>
			<wfw:commentRss>http://comment-apprendre.com/qt-cpp/obtenir-le-padding-margin-et-bordure-de-votre-widget-custom/uncategorized/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Du HTML dans un QTableView</title>
		<link>http://comment-apprendre.com/qt-cpp/du-html-dans-un-qtableview/blog-qt</link>
		<comments>http://comment-apprendre.com/qt-cpp/du-html-dans-un-qtableview/blog-qt#comments</comments>
		<pubDate>Mon, 03 Oct 2011 20:44:03 +0000</pubDate>
		<dc:creator>qt-programmer</dc:creator>
				<category><![CDATA[Blog Qt]]></category>
		<category><![CDATA[delegate]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[mightBeRichText]]></category>
		<category><![CDATA[paint]]></category>
		<category><![CDATA[QStyledItemDelegate]]></category>

		<guid isPermaLink="false">http://comment-apprendre.com/qt-cpp/?p=40</guid>
		<description><![CDATA[Qt ne permet pas d&#8217;inclure du HTML dans un tableau ou un liste Par contre, il est possible d&#8217;arriver à dessiner du &#8220;rich text&#8221; grâce à un delegate. Pour ce qui est de l&#8217;implémentation d&#8217;un delegate, je vous épargne la théorie, c&#8217;est relativement facile, il n&#8217;y a qu&#8217;à voir les centaines d&#8217;exemples sur le web<a href="http://comment-apprendre.com/qt-cpp/du-html-dans-un-qtableview/blog-qt">&#160;&#160;[ Lire plus ]</a>]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fcomment-apprendre.com%2Fqt-cpp%2Fdu-html-dans-un-qtableview%2Fblog-qt"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fcomment-apprendre.com%2Fqt-cpp%2Fdu-html-dans-un-qtableview%2Fblog-qt&amp;source=MartinGamsby&amp;style=normal" height="61" width="50" /><br />
			</a>
		</div>
<p>Qt ne permet pas d&#8217;inclure du HTML dans un tableau ou un liste <img src='http://comment-apprendre.com/qt-cpp/wp-includes/images/smilies/icon_sad.gif' alt=':-(' class='wp-smiley' /> </p>
<p>Par contre, il est possible d&#8217;arriver à dessiner du &#8220;rich text&#8221; grâce à un delegate.</p>
<p>Pour ce qui est de l&#8217;implémentation d&#8217;un delegate, je vous épargne la  théorie, c&#8217;est relativement facile, il n&#8217;y a qu&#8217;à voir les centaines  d&#8217;exemples sur le web à ce sujet.</p>
<p>Cherchez &#8216;HTML OR &#8220;Rich text&#8221; Qt QStyledItemDelegate&#8217; &#8230; ou quelque  chose du genre pour y arriver, parce qu&#8217;effectivement, on doit hériter  de QStyledItemDelegate.</p>
<p>Poiur ce qui est de la méthode paint() surchargée, voici un exemple fonctionnel :</p>
<blockquote>
<pre style="font-size:8pt;">void MyTableViewDelegate::paint(QPainter *a_pPainter
   , const QStyleOptionViewItem &amp;a_Option
   , const QModelIndex &amp;a_Index) const
{
   QVariant value = a_Index.data();
   if (value.isValid() &amp;&amp; !value.isNull())
   {
      // On crée un document pour y écrire du HTML.
      QTextDocument _Document;
      QStyleOptionViewItemV4 _Options = a_Option;

      initStyleOption(&amp;_Options, a_Index);

      // On enregistre le painter pour qu'il ne soit pas
      // modifié à la fin de la méthode.
      a_pPainter-&gt;save();

      QString _Text = _Options.text;

      // Pour voir la sélection, on met le texte en gras
      // si l'item est sélectionné et que la vue a le focus.
      if((a_Option.state &amp; QStyle::State_Selected)
        &amp;&amp; (a_Option.state &amp; QStyle::State_HasFocus))
      {
         _Text = "&lt;div style='color:"
            + a_Option.palette.highlightedText().color().name()
            + "; font-weight: bold;'&gt;" + _Text + "&lt;/div&gt;";
      }

      // On prends la peine de dessiner un document
      // seulement s'il y a du HTML.
      bool _MightBeRichText;
      if(_MightBeRichText = Qt::mightBeRichText(_Text))
         _Options.text = "";

      // S'il y a du HTML, on dessine un controle vide.
      // Sinon on garde le texte et on laisse tomber le document.

      _Options.widget-&gt;style()-&gt;drawControl(QStyle::CE_ItemViewItem
      , &amp;_Options, a_pPainter, _Options.widget);

      if(_MightBeRichText)
      {
         // On met le HTML dans le document (pas setText)
         _Document.setHtml(_Text);

         // On centre le document dans le contrôle.
         QPoint _Point = a_Option.rect.center();

	// On bouge le texte s'il y a une icône.
         QSize _IconSize = _Options.icon.actualSize(_Options.rect.size());
         _Point.setX(a_Option.rect.left()
          + _IconSize.width()
          + (_IconSize.width() &gt; 1 ? 4 : 0));
         // avec une petite marge (4px) pour avoir
         // la même apparence que si on dessine
         // le contrôle normalement.

         int _TextHeight = _Document.size().height();
         // On centre le texte verticalement.
         _Point.setY(_Point.y() -  (_TextHeight&gt;&gt;1));
         a_pPainter-&gt;translate(_Point);      

         // Finalement on dessine le texte HTML.
         _Document.drawContents(a_pPainter);
      }

      // Et on remet le painter comme il était au départ de la méthode.
      a_pPainter-&gt;restore();
   }
}
</pre>
</blockquote>
<p>Voilà !</p>
<p>Ça fonctionne bien pour moi, si vous avez des commentaires, n&#8217;hésitez pas.</p>
]]></content:encoded>
			<wfw:commentRss>http://comment-apprendre.com/qt-cpp/du-html-dans-un-qtableview/blog-qt/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Comment bien détruire avec Qt</title>
		<link>http://comment-apprendre.com/qt-cpp/comment-bien-detruire-avec-qt/qt-cpp</link>
		<comments>http://comment-apprendre.com/qt-cpp/comment-bien-detruire-avec-qt/qt-cpp#comments</comments>
		<pubDate>Tue, 27 Sep 2011 00:43:18 +0000</pubDate>
		<dc:creator>qt-programmer</dc:creator>
				<category><![CDATA[delete]]></category>
		<category><![CDATA[QPointer]]></category>
		<category><![CDATA[Qt c++]]></category>

		<guid isPermaLink="false">http://comment-apprendre.com/qt-cpp/?p=36</guid>
		<description><![CDATA[Vous le savez, gérer la mémoire avec c++ demande une certaine vigilance. En effet, il faut penser à faire un &#8220;delete&#8221; quand on fait un &#8220;new&#8221;. Par contre avec Qt, une grosse partie a déjà été faite pour vous. Si vous donnez un parent à un objet, quand le parent sera détruit, l&#8217;enfant le sera<a href="http://comment-apprendre.com/qt-cpp/comment-bien-detruire-avec-qt/qt-cpp">&#160;&#160;[ Lire plus ]</a>]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fcomment-apprendre.com%2Fqt-cpp%2Fcomment-bien-detruire-avec-qt%2Fqt-cpp"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fcomment-apprendre.com%2Fqt-cpp%2Fcomment-bien-detruire-avec-qt%2Fqt-cpp&amp;source=MartinGamsby&amp;style=normal" height="61" width="50" /><br />
			</a>
		</div>
<p>Vous le savez, gérer la mémoire avec c++ demande une certaine vigilance.</p>
<p>En effet, il faut penser à faire un &#8220;delete&#8221; quand on fait un &#8220;new&#8221;.</p>
<p>Par contre avec Qt, une grosse partie a déjà été faite pour vous. Si vous donnez un parent à un objet, quand le parent sera détruit, l&#8217;enfant le sera aussi !</p>
<p>Donc, si vous donnez comme parent un object qui est géré par Qt à tout ce que vous créez, plus besoin d&#8217;y penser. Bien entendu il y a des exceptions, mais dans ces cas là, on y pense, à notre &#8220;delete&#8221;, et ça peut causer quelques maux de tête &#8230;</p>
<p>Justement parlant d&#8217;exceptions qui donnent mal à la tête, Qt y a pensé aussi.</p>
<p>Si vous voulez partager un pointeur dans différentes classes, mais que vous ne savez pas qui doit le détruire, vous ne savez pas si l&#8217;objet est créé, s&#8217;il a été détruit par Qt par inadvertance &#8230;</p>
<p>Qu&#8217;à cela ne tienne ! Qt a créé une classe QPointer, qui garde un pointeur, et il peut être utilisé comme un pointeur &#8230; à la seule exception près que si l&#8217;objet pointé est détruit, QPointer retourne NULL, ce qui peut être très pratique.</p>
<p>Mais ce n&#8217;est pas tout, Qt a aussi ajouté une fonctionnalité fort utile aux objets: deleteLater().</p>
<p>Parce que parfois, on veut détruire un objet qui a appelé la fonction qui détruit cet objet &#8230; ou en tout cas, un truc qui peut être complexe. Eh bien deleteLater() va détruire l&#8217;objet seulement quand tous les évènements qu&#8217;il est présentement en train de faire seront terminés.</p>
<p>C&#8217;est déjà pas mal pour la gestion de la destruction des objets &#8230; mais il existe aussi d&#8217;autres fonctions fort utiles, comme qDeleteAll(), qui détruit tous les objets contenus dans une liste.</p>
]]></content:encoded>
			<wfw:commentRss>http://comment-apprendre.com/qt-cpp/comment-bien-detruire-avec-qt/qt-cpp/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Quand le signal loadFinished() de QWebview n&#8217;est pas assez</title>
		<link>http://comment-apprendre.com/qt-cpp/when-qwebviews-loadfinished-signal-is-not-enough/qt-cpp</link>
		<comments>http://comment-apprendre.com/qt-cpp/when-qwebviews-loadfinished-signal-is-not-enough/qt-cpp#comments</comments>
		<pubDate>Thu, 01 Sep 2011 16:48:01 +0000</pubDate>
		<dc:creator>qt-programmer</dc:creator>
				<category><![CDATA[QNetwork]]></category>
		<category><![CDATA[Qt c++]]></category>
		<category><![CDATA[QWebView]]></category>

		<guid isPermaLink="false">http://comment-apprendre.com/qt-cpp/?p=29</guid>
		<description><![CDATA[Vous savez probablement que quand une instance de QWebview a terminé de charger la page en cours, vous pouvez simplement vous connecter à son signal loadFinished(), comme ceci : connect(ui-&#62;webView, SIGNAL(loadFinished(bool)), this, SLOT(vLoadFinished(bool))); Mais ce que je ne savais pas il n&#8217;y a pas si longtemps de cela, c&#8217;est que vous pouvez vous connecter avec<a href="http://comment-apprendre.com/qt-cpp/when-qwebviews-loadfinished-signal-is-not-enough/qt-cpp">&#160;&#160;[ Lire plus ]</a>]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fcomment-apprendre.com%2Fqt-cpp%2Fwhen-qwebviews-loadfinished-signal-is-not-enough%2Fqt-cpp"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fcomment-apprendre.com%2Fqt-cpp%2Fwhen-qwebviews-loadfinished-signal-is-not-enough%2Fqt-cpp&amp;source=MartinGamsby&amp;style=normal" height="61" width="50" /><br />
			</a>
		</div>
<p>Vous savez probablement que quand une instance de QWebview a terminé de charger la page en cours, vous pouvez simplement vous connecter à son signal loadFinished(), comme ceci :</p>
<blockquote><p>connect(ui-&gt;webView, SIGNAL(loadFinished(bool)), this, SLOT(vLoadFinished(bool)));</p></blockquote>
<p>Mais ce que je ne savais pas il n&#8217;y a pas si longtemps de cela, c&#8217;est que vous pouvez vous connecter avec le &#8220;network access manager&#8221; (Gestionnaire d&#8217;accès réseau) de l&#8217;instance du QWebview.</p>
<p>Vous pouvez donc savoir tout ce que votre Webview télécharge (les images, par exemple), et plus important encore, les requêtes qui sont faites APRÈS que le page soit chargée, causée par javascript par exemple.</p>
<p>Pour se faire, vous pouvez connecter le QNetworkAccessManager de votre QWebview, dans votre constructeur :</p>
<blockquote><p>QNetworkAccessManager _Mgr;<br />
_Mgr = webView-&gt;page()-&gt;networkAccessManager();</p>
<p>connect(_Mgr, SIGNAL(finished(QNetworkReply*)), this, SLOT(vFinished(QNetworkReply*)));</p></blockquote>
<p>et ensuite implémenter le slot que vous venez tout juste de créer !</p>
<blockquote><p>YourWidgetClass::vFinished(QNetworkReply*)<br />
{<br />
reply-&gt;request()-&gt;url();<br />
}</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://comment-apprendre.com/qt-cpp/when-qwebviews-loadfinished-signal-is-not-enough/qt-cpp/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Trouver la position du curseur en dehors du QMouseEvent</title>
		<link>http://comment-apprendre.com/qt-cpp/trouver-la-position-du-curseur-en-dehors-du-qmouseevent/qt-cpp</link>
		<comments>http://comment-apprendre.com/qt-cpp/trouver-la-position-du-curseur-en-dehors-du-qmouseevent/qt-cpp#comments</comments>
		<pubDate>Sat, 27 Aug 2011 20:23:24 +0000</pubDate>
		<dc:creator>qt-programmer</dc:creator>
				<category><![CDATA[QCursor]]></category>
		<category><![CDATA[QMouseEvent]]></category>
		<category><![CDATA[Qt c++]]></category>

		<guid isPermaLink="false">http://comment-apprendre.com/qt-cpp/?p=21</guid>
		<description><![CDATA[Vous savez sans doute qu&#8217;on peut accéder à la position du curseur grâce au QMouseEvent, en ré implémentant la méthode mouseMoveEvent, par exemple. Par contre, si vous voulez la position du curseur en dehors de cette méthode pour une quelconque raison, vous n&#8217;avez qu&#8217;à utiliser une méthode statique de QCursor. QPoint _Point = _pWidget-&#62;mapFromGlobal(QCursor::pos()); &#160;]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fcomment-apprendre.com%2Fqt-cpp%2Ftrouver-la-position-du-curseur-en-dehors-du-qmouseevent%2Fqt-cpp"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fcomment-apprendre.com%2Fqt-cpp%2Ftrouver-la-position-du-curseur-en-dehors-du-qmouseevent%2Fqt-cpp&amp;source=MartinGamsby&amp;style=normal" height="61" width="50" /><br />
			</a>
		</div>
<p>Vous savez sans doute qu&#8217;on peut accéder à la position du curseur grâce au QMouseEvent, en ré implémentant la méthode mouseMoveEvent, par exemple.</p>
<p>Par contre, si vous voulez la position du curseur en dehors de cette méthode pour une quelconque raison, vous n&#8217;avez qu&#8217;à utiliser une méthode statique de QCursor.</p>
<blockquote><p>QPoint _Point = _pWidget-&gt;mapFromGlobal(QCursor::pos());</p></blockquote>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://comment-apprendre.com/qt-cpp/trouver-la-position-du-curseur-en-dehors-du-qmouseevent/qt-cpp/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Créer un fichier avec QFile</title>
		<link>http://comment-apprendre.com/qt-cpp/creer-un-fichier-avec-qfile/qt-cpp</link>
		<comments>http://comment-apprendre.com/qt-cpp/creer-un-fichier-avec-qfile/qt-cpp#comments</comments>
		<pubDate>Wed, 24 Aug 2011 02:03:40 +0000</pubDate>
		<dc:creator>qt-programmer</dc:creator>
				<category><![CDATA[QFile]]></category>
		<category><![CDATA[Qt c++]]></category>
		<category><![CDATA[créer]]></category>
		<category><![CDATA[fichier]]></category>

		<guid isPermaLink="false">http://comment-apprendre.com/qt-cpp/?p=15</guid>
		<description><![CDATA[Si vous voulez créer un fichier avec QFile, il n&#8217;y a pas de fonction comme touch() sur linux, mais vous pouvez facilement créer un fichier vide avec la méthode open(). QFile( _Path ).open( QIODevice::WriteOnly ); En effet, QFile crée automatiquement le fichier s&#8217;il n&#8217;existe pas et que vous voulez y écrire.]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fcomment-apprendre.com%2Fqt-cpp%2Fcreer-un-fichier-avec-qfile%2Fqt-cpp"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fcomment-apprendre.com%2Fqt-cpp%2Fcreer-un-fichier-avec-qfile%2Fqt-cpp&amp;source=MartinGamsby&amp;style=normal" height="61" width="50" /><br />
			</a>
		</div>
<p>Si vous voulez créer un fichier avec QFile, il n&#8217;y a pas de fonction comme touch() sur linux, mais vous pouvez facilement créer un fichier vide avec la méthode open().</p>
<blockquote><p>
QFile( _Path ).open( QIODevice::WriteOnly );</p></blockquote>
<p>En effet, QFile crée automatiquement le fichier s&#8217;il n&#8217;existe pas et que vous voulez y écrire.</p>
]]></content:encoded>
			<wfw:commentRss>http://comment-apprendre.com/qt-cpp/creer-un-fichier-avec-qfile/qt-cpp/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Nouveau blog sur Qt c++</title>
		<link>http://comment-apprendre.com/qt-cpp/bienvenue/blog-qt</link>
		<comments>http://comment-apprendre.com/qt-cpp/bienvenue/blog-qt#comments</comments>
		<pubDate>Mon, 01 Aug 2011 01:52:53 +0000</pubDate>
		<dc:creator>qt-programmer</dc:creator>
				<category><![CDATA[Blog Qt]]></category>

		<guid isPermaLink="false">http://comment-apprendre.com/qt-cpp/?p=1</guid>
		<description><![CDATA[J&#8217;ai découvert Qt il y a quelques années, et à chaque fois que je l&#8217;utilise, sa facilité d&#8217;utilisation m&#8217;impressionne. À chaque fois que j&#8217;utilise un autre framework, je m&#8217;ennuie de Qt. C&#8217;est pourquoi j&#8217;ai décidé de créer ce blog pour y inclure les parties qui m&#8217;ont donné du mal. Parce que, oui, le cadre d&#8217;applications<a href="http://comment-apprendre.com/qt-cpp/bienvenue/blog-qt">&#160;&#160;[ Lire plus ]</a>]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fcomment-apprendre.com%2Fqt-cpp%2Fbienvenue%2Fblog-qt"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fcomment-apprendre.com%2Fqt-cpp%2Fbienvenue%2Fblog-qt&amp;source=MartinGamsby&amp;style=normal" height="61" width="50" /><br />
			</a>
		</div>
<p>J&#8217;ai découvert Qt il y a quelques années, et à chaque fois que je l&#8217;utilise, sa facilité d&#8217;utilisation m&#8217;impressionne. À chaque fois que j&#8217;utilise un autre framework, je m&#8217;ennuie de Qt.</p>
<p>C&#8217;est pourquoi j&#8217;ai décidé de créer ce blog pour y inclure les parties qui m&#8217;ont donné du mal. Parce que, oui, le cadre d&#8217;applications Qt n&#8217;est pas infaillible, et parfois il peut être &#8220;stupide&#8221;, mais je pense que ça ne vaut pas la peine de buter sur ce genre de choses.</p>
<p>De plus, j&#8217;aimerais montrer à de nouveaux utilisateurs ce que Qt est capable de faire, parce que quand j&#8217;ai commencé, j&#8217;étais loin de me douter de tout ce que je pouvais faire avec.</p>
<p>Ceci étant dit, si jamais vous butez sur un problème en Qt, faites-le moi savoir dans les commentaires. Qui sait, peut-être que je vais en faire un prochain post ? <img src='http://comment-apprendre.com/qt-cpp/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://comment-apprendre.com/qt-cpp/bienvenue/blog-qt/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
