{"id":125,"date":"2016-10-08T11:06:08","date_gmt":"2016-10-08T11:06:08","guid":{"rendered":"http:\/\/renaudguezennec.eu\/?p=125"},"modified":"2025-08-17T20:12:28","modified_gmt":"2025-08-17T20:12:28","slug":"faire-une-presentation-qml","status":"publish","type":"post","link":"http:\/\/renaudguezennec.eu\/index.php\/2016\/10\/08\/faire-une-presentation-qml\/","title":{"rendered":"Retours d\u2019exp\u00e9rience d\u2019une pr\u00e9sentation QML"},"content":{"rendered":"<p>Pour pr\u00e9parer ma conf\u00e9rence \u00e0 <a href=\"https:\/\/www.youtube.com\/watch?v=FAMBDJ9Tkf0\" target=\"_blank\" rel=\"noopener\">Pas Sage En Seine [FR]<\/a>, j\u2019ai d\u00e9cid\u00e9 de faire une pr\u00e9sentation QML.<br \/>\nCela offre un bien meilleur contr\u00f4le, bien plus de possibilit\u00e9 graphique (animations, int\u00e9gration de code, 3D\u2026) et de m\u00eame de l\u2019interactivit\u00e9.<br \/>\nBien s\u00fbr, une pr\u00e9sentation QML demande plus de temps \u00e0 faire. Le but de l&#8217;article est ici d&#8217;expliquer les astuces que j&#8217;ai mises en place. Esp\u00e9rant gagner du temps la prochaine fois.<\/p>\n<h2>Le contenu de la pr\u00e9sentation QML:<\/h2>\n<p>Comme vous pouvez le voir, la pr\u00e9sentation est une application C++ qui affiche du QML. Cette m\u00e9thode permet de faciliter le contr\u00f4le de la partie QML. Je m\u2019en sers pour enregistrer des captures d&#8217;\u00e9cran de la pr\u00e9sentation afin d&#8217;en faire un PDF. C&#8217;est le meilleur pour distribuer la pr\u00e9sentation ou dans le cas ou pour \u00e9viter l&#8217;effet d\u00e9mo.<br \/>\nTout en haut, il y a les classes C++, les fichiers de management du projet et le fichier main.qml. Dans le r\u00e9pertoire \u00abpages\u00bb, vous y trouverez les diff\u00e9rentes slides de la pr\u00e9sentation. Dans rsrc, il y a l&#8217;ensemble des images n\u00e9cessaire \u00e0 la pr\u00e9sentation.<\/p>\n<pre>\u251c\u2500\u2500 cpphighlighter.cpp\r\n\u251c\u2500\u2500 cpphighlighter.h \r\n\u251c\u2500\u2500 deployment.pri \r\n\u251c\u2500\u2500 LICENSE \r\n\u251c\u2500\u2500 main.cpp \r\n\u251c\u2500\u2500 main.qml \r\n\u251c\u2500\u2500 pages \r\n\u2502 \u251c\u2500\u2500 01_intro.qml \r\n\u2502 \u251c\u2500\u2500 02_presentation.qml \r\n\u2502 \u251c\u2500\u2500 03_jdr_et_rolisteam.qml \r\n\u2502 \u251c\u2500\u2500 043_Exemple_code_1.qml \r\n\u2502 \u251c\u2500\u2500 04_jdr_avantages_pb.qml \r\n\u2502 \u251c\u2500\u2500 05_avantage_jdr_virtuel.qml \r\n\u2502 \u251c\u2500\u2500 06_fonctionnalites_rolisteam.qml \r\n\u2502 \u251c\u2500\u2500 07_rolisteam_debut.qml \r\n\u2502 \u251c\u2500\u2500 08_Rolistik_a_Rolisteam.qml \r\n\u2502 \u251c\u2500\u2500 10_frise_chronologique.qml \r\n\u2502 \u251c\u2500\u2500 11_son_usage.qml \r\n\u2502 \u251c\u2500\u2500 12_son_fonctionnement.qml \r\n\u2502 \u251c\u2500\u2500 13_dice_parser.qml \r\n\u2502 \u251c\u2500\u2500 14_themes_audio_3_pistes.qml \r\n\u2502 \u251c\u2500\u2500 15_nouveaute_1_8.qml \r\n\u2502 \u251c\u2500\u2500 16_projet_avenir.qml \r\n\u2502 \u251c\u2500\u2500 17_reussites.qml \r\n\u2502 \u251c\u2500\u2500 18_les_lecons.qml \r\n\u2502 \u251c\u2500\u2500 19_objectif_rolisteam_libre.qml \r\n\u2502 \u251c\u2500\u2500 20_FAQ.qml \r\n\u251c\u2500\u2500 pasSageEnSeine.pro \r\n\u251c\u2500\u2500 pasSageEnSeine.pro.user \r\n\u251c\u2500\u2500 qmlcontroler.cpp \r\n\u251c\u2500\u2500 qmlcontroler.h \r\n\u251c\u2500\u2500 qmlcontroler.ui \r\n\u251c\u2500\u2500 qml.qrc \r\n\u251c\u2500\u2500 README.md \r\n\u251c\u2500\u2500 rsrc \r\n\u2502 \u251c\u2500\u2500 all.png \r\n\u2502 \u251c\u2500\u2500 cc.png \r\n\u2502 \u2514\u2500\u2500 chat.png<\/pre>\n<h2>L&#8217;application C++<\/h2>\n<p>Il peut \u00eatre utile de conna\u00eetre l&#8217;\u00e9tat de la pr\u00e9sentation QML, et de pouvoir lire des notes sur chaque volet. Pour faire cela, j&#8217;ai \u00e9cris une petite application C++.<\/p>\n<h3>le fichier main.cpp<\/h3>\n<p>Le premier objectif de l&#8217;application est d&#8217;afficher la pr\u00e9sentation QML. Il faut donc charger le QML et \u00e9tablir des moyens de communication entre le monde QML et le C++. Comme vous pouvez le voir, je passe en param\u00e8tre la taille de la pr\u00e9sentation en param\u00e8tre du QML. Ce dernier \u00e9l\u00e9ment n&#8217;est pas obligatoire car par d\u00e9faut j&#8217;utilise la taille de l&#8217;\u00e9cran comme r\u00e9f\u00e9rence.<\/p>\n<p>[pastacode lang=&#8221;cpp&#8221; manual=&#8221;%23include%20%3CQApplication%3E%0A%23include%20%3CQQmlApplicationEngine%3E%0A%23include%20%22qmlcontroler.h%22%0A%23include%20%3CQQmlContext%3E%0A%23include%20%3CQQuickTextDocument%3E%0A%0A%23include%20%22cpphighlighter.h%22%0A%0Aint%20main(int%20argc%2C%20char%20*argv%5B%5D)%0A%7B%0A%20%20%20%20QApplication%20app(argc%2C%20argv)%3B%0A%0A%20%20%20%20QQmlApplicationEngine%20engine%3B%0A%0A%20%20%20%20engine.rootContext()-%3EsetContextProperty(%22ScreenW%22%2C1280)%3B%0A%20%20%20%20engine.rootContext()-%3EsetContextProperty(%22ScreenH%22%2C720)%3B%0A%0A%20%20%20%20engine.load(QUrl(QStringLiteral(%22qrc%3A%2Fmain.qml%22)))%3B%0A%0A%20%20%20%20QmlControler%20ctr%3B%0A%20%20%20%20ctr.setEngine(%26engine)%3B%0A%0A%20%20%20%20return%20app.exec()%3B%0A%7D%0A&#8221; message=&#8221;main.cpp&#8221; highlight=&#8221;&#8221; provider=&#8221;manual&#8221;\/]<\/p>\n<p>Dans ce projet, la classe QmlControler est l&#8217;objet (fen\u00eatre) C++ qui affiche l&#8217;aper\u00e7u de la pr\u00e9sentation et les commentaires\/notes.<\/p>\n<p>Regardons en d\u00e9tails cet \u00e9l\u00e9ment:<\/p>\n<h3>La fen\u00eatre d&#8217;aper\u00e7u<\/h3>\n<p>C&#8217;est une simple fen\u00eatre. Elle est d\u00e9coup\u00e9e en deux parties.\u00a0 Celle de gauche affiche dans un QLabel l&#8217;aper\u00e7u de la pr\u00e9sentation QML. La partie de droite affiche les notes et commentaires sur la page courante dans un QTextArea.<\/p>\n<p>[pastacode lang=&#8221;cpp&#8221; manual=&#8221;void%20QmlControler%3A%3AcurrentPageHasChanged(int%20i)%0A%7B%0A%20%20%20%20m_currentScreen%20%3D%20i%3B%0A%20%20%20%20QImage%20img%20%3D%20m_window-%3EgrabWindow()%3B%0A%0A%20%20%20%20if(img.isNull())%0A%20%20%20%20%20%20%20%20return%3B%0A%0A%20%20%20%20static%20int%20count%20%3D%200%3B%0A%0A%0A%20%20%20%20img.save(tr(%22screens%2F%251_screen.png%22).arg(%2B%2Bcount%2C3%2C10%2CQChar(&#8216;0&#8217;))%2C%22png%22)%3B%0A%20%20%20%20qDebug()%20%3C%3C%20%22screen%20shot%20save%22%20%3C%3C%20count%3B%0A%0A%20%20%20%20m_ratioImage%20%3D%20(double)img.size().width()%2Fimg.size().height()%3B%0A%20%20%20%20m_ratioImageBis%20%3D%20(double)img.size().height()%2Fimg.size().width()%3B%0A%0A%20%20%20%20m_label-%3EsetPixmap(QPixmap%3A%3AfromImage(img))%3B%0A%0A%20%20%20%20if((i%2B1%3E%3D0)%26%26(i%2B1%3Cm_commentData.size()))%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20ui-%3EtextEdit-%3EsetHtml(m_commentData.at(i%2B1))%3B%0A%20%20%20%20%7D%0A%20%20%20%20resizeLabel()%3B%0A%7D&#8221; message=&#8221;Current slide has changed&#8221; highlight=&#8221;&#8221; provider=&#8221;manual&#8221;\/]<\/p>\n<p>Quand la page courante change, la fen\u00eatre C++ est inform\u00e9 par l&#8217;appel du slot: currentPageHasChanged alors l&#8217;application r\u00e9cup\u00e8re une capture de la vue QML, l&#8217;affiche \u00e0 l&#8217;\u00e9cran (dans la partie gauche), affiche les notes \u00e0 propos de la page courante et peut sauvegarder la capture dans un fichier.<\/p>\n<p>Sauvegarder les captures dans des fichiers vous permet de cr\u00e9er un fichier PDF de votre pr\u00e9sentation. Il s&#8217;agit l\u00e0 d&#8217;une solution de secours en cas de probl\u00e8me avec le mat\u00e9riel de la pr\u00e9sentation ou une facilit\u00e9 pour distribuer votre pr\u00e9sentation.<\/p>\n<p>La commande qui va bien (sous linux) :<\/p>\n<blockquote><p>$ convert *.png mypresentation.pdf<\/p><\/blockquote>\n<p>&nbsp;<\/p>\n<h2>L&#8217;application QML<\/h2>\n<h3>Le syst\u00e8me de chargement (Loader)<\/h3>\n<p>Par souci de clart\u00e9, je pr\u00e9f\u00e8re avoir un fichier par page. Cela \u00e9vite l&#8217;\u00e9cueil d&#8217;un fichier QML long et complexe. L&#8217;application charge les pages en accord avec le modele de donn\u00e9es principal dans le m\u00eame ordre.\u00a0 Pour faire cela, j&#8217;ai utilis\u00e9 un ListModel. Une page est d\u00e9finie par un titre, un nom de fichier, un temps (non utilis\u00e9), et le nom de la page suivante.<br \/>\nLe fichier main.qml\u00a0 affiche toutes les pages comme un \u00abdelegate\u00bb d&#8217;un <a href=\"http:\/\/doc.qt.io\/qt-5\/qml-qtquick-pathview.html\">pathview<\/a>.\u00a0 Toutes les pages sont charg\u00e9s depuis le fichier de ressources de Qt (inclue dans le binaire gr\u00e2ce au syst\u00e8me de ressources de Qt).<\/p>\n<p>[pastacode lang=&#8221;css&#8221; manual=&#8221;ListModel%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20id%3A%20panelModel%0A%20%20%20%20%20%20%20%20%20%20%20%20ListElement%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20name%3A%20%22Intro%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20path%3A%20%2201_intro.qml%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20time%3A%201%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20next%3A%20%22Pr%C3%A9sentation%20de%20Rolisteam%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D&#8221; message=&#8221;First item of the model.&#8221; highlight=&#8221;&#8221; provider=&#8221;manual&#8221;\/]<\/p>\n<p>La donn\u00e9e vraiment utile pour le chargement est bien s\u00fbr le nom du fichier.<br \/>\nLes autres sont l\u00e0 pour aider la r\u00e9daction ou la pr\u00e9sentation.<\/p>\n<p>Le loader fait son travail, voici les lignes importantes:<\/p>\n<p>[pastacode lang=&#8221;css&#8221; manual=&#8221;%20%20%20%20PathView%20%7B%0A%20%20%20%20%20%20%20%20id%3A%20view%0A%20%20%20%20%20%20%20%20anchors.fill%3A%20parent%0A%20%20%20%20%20%20%20%20model%3A%20panelModel%0A%20%20%20%20%20%20%20%20highlightRangeMode%3APathView.StrictlyEnforceRange%0A%20%20%20%20%20%20%20%20snapMode%3A%20PathView.SnapOneItem%0A%20%20%20%20%20%20%20%20delegate%3A%20%20Loader%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20source%3A%20%22pages%2F%22%2Bpath%0A%20%20%20%20%20%20%20%20%7D&#8221; message=&#8221;Path View&#8221; highlight=&#8221;source: &#8220;pages\/&#8221;+path&#8221; provider=&#8221;manual&#8221;\/]<\/p>\n<p>Le temps \u00e9tait destin\u00e9 \u00e0 afficher un compte \u00e0 rebours pour chaque slide mais je n&#8217;ai pas eu le temps de l&#8217;impl\u00e9menter.<\/p>\n<p>Il est important de mettre dans le main.qml tous les \u00e9l\u00e9ments que vous souhaitez avoir sur toutes les pages: le sommaire, l&#8217;indication de la page courante sur le total de pages, etc.<\/p>\n<h3>Ajouter un sommaire<\/h3>\n<p>Pour r\u00e9aliser un sommaire, j&#8217;ai ajout\u00e9 un ListView avec le modele suivant:<\/p>\n<p>[pastacode lang=&#8221;css&#8221; manual=&#8221;%20%20%20%20ListView%20%7B%0A%20%20%20%20%20%20%20%20id%3A%20listView1%0A%20%20%20%20%20%20%20%20x%3A%20ScreenW*0.02%0A%20%20%20%20%20%20%20%20y%3A%20ScreenH*0.3%0A%20%20%20%20%20%20%20%20width%3A%20ScreenW%2F2%0A%20%20%20%20%20%20%20%20height%3A%20ScreenH*0.2%0A%20%20%20%20%20%20%20%20delegate%3A%20Item%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20width%3A%20ScreenW%2F2%0A%20%20%20%20%20%20%20%20%20%20%20%20height%3A%20listView1.height%2FlistView1.count%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Text%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20color%3A%20view.currentIndex%3E%3Dindex%20%3F%20%22black%22%20%3A%20%22gray%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20name%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20font.pointSize%3A%20ScreenH%2F48%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20anchors.verticalCenter%3A%20parent.verticalCenter%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20font.bold%3A%20true%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20visible%3A%20view.currentIndex%3E0%20%3F%20true%20%3A%20false%0A%0A%20%20%20%20%20%20%20%20model%3A%20ListModel%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20ListElement%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20name%3A%20%22Concepts%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20index%3A1%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20ListElement%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20name%3A%20%22Chroniques%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20index%3A6%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20ListElement%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20name%3A%20%22Logiciel%22%2F%2Fsyst%C3%A8me%20de%20build%2C%20code%20sp%C3%A9cifique%20par%20OS.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20index%3A9%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20ListElement%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20name%3A%20%22Bilan%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20index%3A15%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D&#8221; message=&#8221;Table of contents in QML &#8221; highlight=&#8221;&#8221; provider=&#8221;manual&#8221;\/]<\/p>\n<p>Le champs index du mod\u00e8le permet de conna\u00eetre la page qui d\u00e9marre cette section du sommaire.<\/p>\n<h3>Page suivante<\/h3>\n<p>Quand il y a beaucoup de pages il peut \u00eatre int\u00e9ressant de conna\u00eetre la prochaine page afin de faire une petite transition vers elle. Dans mon cas, j&#8217;affiche dans le coin haut-droit le titre de la prochaine page. Ce fut assez utile pour les r\u00e9p\u00e9titions, je n&#8217;en ai presque pas eu besoin pendant la conf\u00e9rence.<\/p>\n<p>[pastacode lang=&#8221;css&#8221; manual=&#8221;%20%20%20%20Text%20%7B%0A%20%20%20%20%20%20%20%20anchors.top%3A%20parent.top%0A%20%20%20%20%20%20%20%20anchors.right%3A%20parent.right%0A%20%20%20%20%20%20%20%20text%3A%20panelModel.get(view.currentIndex).next%2B%22%3E%22%0A%20%20%20%20%7D&#8221; message=&#8221;Next slide&#8221; highlight=&#8221;&#8221; provider=&#8221;manual&#8221;\/]<\/p>\n<p>L&#8217;autre possibilit\u00e9 est d&#8217;utiliser les notes dans la fen\u00eatre C++.<\/p>\n<h2>Cr\u00e9er une Page de pr\u00e9sentation QML<\/h2>\n<p>Chaque page est ind\u00e9pendante, elles peuvent \u00eatre totalement diff\u00e9rentes cependant pour des raisons de simplicit\u00e9, elle utilise une conception identique. Dans mon cas, elles sont constitu\u00e9es d&#8217;une ListView avec un mod\u00e8le. Chaque \u00e9l\u00e9ment du mod\u00e8le est un titre de section \u00e0 \u00e9voquer pendant la pr\u00e9sentation.<\/p>\n<p>Les \u00e9l\u00e9ments ont un index. Cet index est contr\u00f4l\u00e9 par le clavier (fl\u00e8che bas pour augmenter l&#8217;index, haut pour r\u00e9duire l&#8217;index).\u00a0 Gr\u00e2ce \u00e0 cet index, il est possible de cacher la liste et d&#8217;afficher une image, un sch\u00e9ma ou une vid\u00e9o.<\/p>\n<p>Par exemple, dans ma pr\u00e9sentation la fonctionnalit\u00e9 \u00abAlias de d\u00e9s\u00bb a pour index 10. Quand la index de la page devient 10, l&#8217;\u00e9l\u00e9ment \u00abAlias de d\u00e9s\u00bb appara\u00eet avec une petite animation. Puis l&#8217;index passe \u00e0 11, j&#8217;affiche une image illustrant la fonctionnalit\u00e9 des alias de d\u00e9s. A 12, l&#8217;image dispara\u00eet et le texte revient.<\/p>\n<h3>Position et taille<\/h3>\n<p>Pour s&#8217;assurer de la lisibilit\u00e9 des \u00e9l\u00e9ments, je r\u00e9alise l&#8217;ensemble des calculs en rapport \u00e0 la taille de l&#8217;\u00e9cran. Le positionnement est assur\u00e9 par des ancres (anchors en qml).<\/p>\n<p>[pastacode lang=&#8221;css&#8221; manual=&#8221;%20%20%20%20Image%20%7B%0A%20%20%20%20%20%20%20%20id%3A%20image1%0A%20%20%20%20%20%20%20%20anchors.left%3A%20parent.left%0A%20%20%20%20%20%20%20%20anchors.top%3A%20parent.top%0A%20%20%20%20%20%20%20%20anchors.leftMargin%3A%20ScreenW*0.04%0A%20%20%20%20%20%20%20%20fillMode%3A%20Image.PreserveAspectFit%0A%20%20%20%20%20%20%20%20source%3A%20%22qrc%3A%2Frsrc%2FRolisteam.svg%22%0A%20%20%20%20%20%20%20%20width%3A%20ScreenW*0.2%0A%20%20%20%20%7D&#8221; message=&#8221;Display the logo at the right position and size.&#8221; highlight=&#8221;&#8221; provider=&#8221;manual&#8221;\/]<\/p>\n<h2>Autre piste<\/h2>\n<p>Il existe un module qui fournit des \u00e9l\u00e9ments QML pour faciliter la r\u00e9alisation d&#8217;une pr\u00e9sentation. Je ne l&#8217;ai pas utilis\u00e9 mais il y a des choses int\u00e9ressantes.<\/p>\n<p><a href=\"https:\/\/github.com\/qt-labs\/qml-presentation-system\" target=\"_blank\" rel=\"noopener\">Module QML<\/a><\/p>\n<h2>Obtenir le code de mes pr\u00e9sentations<\/h2>\n<p>Je vous invite \u00e0 cloner ce code : <a href=\"https:\/\/github.com\/obiwankennedy\/pses\">https:\/\/github.com\/obiwankennedy\/pses<\/a><\/p>\n<p>Autre exemple avec une image: <a href=\"https:\/\/github.com\/obiwankennedy\/l5rSummary\">https:\/\/github.com\/obiwankennedy\/l5rSummary<\/a><\/p>\n<div id=\"attachment_150\" style=\"width: 310px\" class=\"wp-caption alignleft\"><a href=\"http:\/\/renaudguezennec.eu\/wp-content\/uploads\/2016\/10\/Screenshot-from-2016-12-02-21-18-29.jpg\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-150\" class=\"wp-image-150 size-medium\" src=\"http:\/\/renaudguezennec.eu\/wp-content\/uploads\/2016\/10\/Screenshot-from-2016-12-02-21-18-29-300x169.jpg\" alt=\"L5R pr\u00e9sentation QML\" width=\"300\" height=\"169\" srcset=\"http:\/\/renaudguezennec.eu\/wp-content\/uploads\/2016\/10\/Screenshot-from-2016-12-02-21-18-29-300x169.jpg 300w, http:\/\/renaudguezennec.eu\/wp-content\/uploads\/2016\/10\/Screenshot-from-2016-12-02-21-18-29-768x432.jpg 768w, http:\/\/renaudguezennec.eu\/wp-content\/uploads\/2016\/10\/Screenshot-from-2016-12-02-21-18-29-1024x575.jpg 1024w, http:\/\/renaudguezennec.eu\/wp-content\/uploads\/2016\/10\/Screenshot-from-2016-12-02-21-18-29-620x348.jpg 620w, http:\/\/renaudguezennec.eu\/wp-content\/uploads\/2016\/10\/Screenshot-from-2016-12-02-21-18-29.jpg 1920w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><p id=\"caption-attachment-150\" class=\"wp-caption-text\">Exemple de pr\u00e9sentation QML<\/p><\/div>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Pour pr\u00e9parer ma conf\u00e9rence \u00e0 Pas Sage En Seine [FR], j\u2019ai d\u00e9cid\u00e9 de faire une pr\u00e9sentation QML. Cela offre un bien meilleur contr\u00f4le, bien plus de possibilit\u00e9 graphique (animations, int\u00e9gration de code, 3D\u2026) et de m\u00eame de l\u2019interactivit\u00e9. Bien s\u00fbr, une pr\u00e9sentation QML demande plus de temps \u00e0 faire. Le but de l&#8217;article est ici [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":150,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_import_markdown_pro_load_document_selector":0,"_import_markdown_pro_submit_text_textarea":"","footnotes":""},"categories":[80,23],"tags":[37,38,34,10,36],"class_list":["post-125","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-fr","category-tutorial","tag-dev","tag-presentation","tag-qml","tag-qt","tag-qt5"],"_links":{"self":[{"href":"http:\/\/renaudguezennec.eu\/index.php\/wp-json\/wp\/v2\/posts\/125","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/renaudguezennec.eu\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/renaudguezennec.eu\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/renaudguezennec.eu\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/renaudguezennec.eu\/index.php\/wp-json\/wp\/v2\/comments?post=125"}],"version-history":[{"count":10,"href":"http:\/\/renaudguezennec.eu\/index.php\/wp-json\/wp\/v2\/posts\/125\/revisions"}],"predecessor-version":[{"id":5077,"href":"http:\/\/renaudguezennec.eu\/index.php\/wp-json\/wp\/v2\/posts\/125\/revisions\/5077"}],"wp:featuredmedia":[{"embeddable":true,"href":"http:\/\/renaudguezennec.eu\/index.php\/wp-json\/wp\/v2\/media\/150"}],"wp:attachment":[{"href":"http:\/\/renaudguezennec.eu\/index.php\/wp-json\/wp\/v2\/media?parent=125"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/renaudguezennec.eu\/index.php\/wp-json\/wp\/v2\/categories?post=125"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/renaudguezennec.eu\/index.php\/wp-json\/wp\/v2\/tags?post=125"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}