<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>KDE on Le Blog de Rebel Zhang</title>
        <link>https://rebel1725.codeberg.page/blog/fr/tags/kde/</link>
        <description>Recent content in KDE on Le Blog de Rebel Zhang</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>fr-FR</language>
        <managingEditor>rebel1725@tilde.club (Rebel Zhang)</managingEditor>
        <webMaster>rebel1725@tilde.club (Rebel Zhang)</webMaster>
        <lastBuildDate>Sun, 09 Aug 2026 20:49:33 +0800</lastBuildDate><atom:link href="https://rebel1725.codeberg.page/blog/fr/tags/kde/index.xml" rel="self" type="application/rss+xml" /><item>
            <title>Trouver l’implémentation d’une fonctionnalité dans une application QtWidgets à l’aide de GammaRay</title>
            <link>https://rebel1725.codeberg.page/blog/fr/post/find-the-implementation-of-a-function-in-a-qtwidgets-application-using-gammaray/</link>
            <pubDate>Sun, 09 Aug 2026 20:49:33 +0800</pubDate><author>rebel1725@tilde.club (Rebel Zhang)</author>
            <guid>https://rebel1725.codeberg.page/blog/fr/post/find-the-implementation-of-a-function-in-a-qtwidgets-application-using-gammaray/</guid>
            <description>&lt;p&gt;Pour exercer la Liberté 1 et la Liberté 3 du logiciel libre, et/ou contribuer à la communauté du logiciel libre, nous devons modifier le code source lié à une fonctionnalité afin de faire faire au logiciel quelque chose de différent. Cependant, comme nous ne connaissons pas bien un projet, nous ne savons souvent pas où se trouve le code source que nous devons modifier. Vous aurez peut-être de la chance en essayant &lt;code&gt;grep -R &amp;lt;some-user-facing-string&amp;gt; .&lt;/code&gt; ; toutefois, cela ne fonctionnera parfois pas (voir &lt;a class=&#34;link&#34; href=&#34;../the-very-beginning-of-my-journey-contributing-to-the-free-software-community-existing-projects&#34; &gt;l’article précédent&lt;/a&gt;). Dans ce cas, il nous faudra des outils avancés d’introspection logicielle. Pour les logiciels développés avec Qt, un utilitaire puissant est &lt;a class=&#34;link&#34; href=&#34;https://www.kdab.com/software-technologies/developer-tools/gammaray/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;GammaRay&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Pour utiliser GammaRay, vous devez d’abord l’installer. Si vous souhaitez introspecter un logiciel installé depuis le dépôt officiel de votre distribution, installez également GammaRay depuis celui-ci :&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;# apt install gammaray&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Si vous utilisez &lt;code&gt;kde-builder&lt;/code&gt; pour développer des applications KDE, ajoutez ces lignes à votre &lt;code&gt;~/.config/kde-builder.yaml&lt;/code&gt; :&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;project gammaray:&#xA;  repository: https://github.com/KDAB/GammaRay.git&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;puis compilez-le dans votre répertoire de travail :&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ kde-builder gammaray&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Pour utiliser GammaRay, il faut que l’application que vous souhaitez introspecter soit en cours d’exécution. Ensuite, lancez GammaRay et choisissez votre application dans la liste.&lt;/p&gt;&#xA;&lt;p&gt;Prenons comme exemple la recherche de la logique du diaporama dans Gwenview. Ouvrez Gwenview, puis ouvrez une image ; vous verrez alors l’option &lt;code&gt;Start Slideshow&lt;/code&gt; dans le menu :&lt;/p&gt;&#xA;&lt;p&gt;&lt;img alt=&#34;a screenshot of Gwenview&#34; class=&#34;gallery-image&#34; data-flex-basis=&#34;390px&#34; data-flex-grow=&#34;162&#34; height=&#34;952&#34; loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://rebel1725.codeberg.page/images/pic_20260809_001.png&#34; srcset=&#34;https://rebel1725.codeberg.page/blog/pic_20260809_001_9260183633641420788_hu_365916c355e33157.png 800w, https://rebel1725.codeberg.page/images/pic_20260809_001.png 1548w&#34; width=&#34;1548&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;En parcourant la liste des widgets un par un, vous verrez que &lt;code&gt;0x13bda470&lt;/code&gt; est le menu que nous voulons introspecter, lequel contient l’option &lt;code&gt;Start Slideshow&lt;/code&gt; :&lt;/p&gt;&#xA;&lt;p&gt;&lt;img alt=&#34;GammaRay QtWidgets introspection&#34; class=&#34;gallery-image&#34; data-flex-basis=&#34;402px&#34; data-flex-grow=&#34;167&#34; height=&#34;1002&#34; loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://rebel1725.codeberg.page/images/pic_20260809_002.png&#34; srcset=&#34;https://rebel1725.codeberg.page/blog/pic_20260809_002_4293608996693979957_hu_43bd5ee0e43f111b.png 800w, https://rebel1725.codeberg.page/blog/pic_20260809_002_4293608996693979957_hu_c573a96130bd048e.png 1600w, https://rebel1725.codeberg.page/images/pic_20260809_002.png 1681w&#34; width=&#34;1681&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Et nous verrons une QAction &lt;code&gt;toggle_slideshow&lt;/code&gt; dans l’onglet Connections :&lt;/p&gt;&#xA;&lt;p&gt;&lt;img alt=&#34;Connections&#34; class=&#34;gallery-image&#34; data-flex-basis=&#34;304px&#34; data-flex-grow=&#34;126&#34; height=&#34;604&#34; loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://rebel1725.codeberg.page/images/pic_20260809_003.png&#34; width=&#34;767&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;grep&lt;/code&gt; nous indiquera où se trouve une telle QAction :&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;~/kde/src/gwenview$ grep -R toggle_slideshow&#xA;app/fullscreencontent.cpp:    addAction(QStringLiteral(&amp;#34;toggle_slideshow&amp;#34;));&#xA;app/gwenviewui.rc:        &amp;lt;Action name=&amp;#34;toggle_slideshow&amp;#34; /&amp;gt;&#xA;app/mainwindow.cpp:        mToggleSlideShowAction = view-&amp;gt;addAction(QStringLiteral(&amp;#34;toggle_slideshow&amp;#34;), q, &amp;amp;MainWindow::toggleSlideShow);&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Ouvrez le projet dans votre IDE favori, par exemple Qt Creator, puis recherchez la chaîne dans &lt;code&gt;app/mainwindow.cpp&lt;/code&gt;. Nous trouverons ici &lt;code&gt;toggle_slideshow&lt;/code&gt; :&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;        mToggleSlideShowAction = view-&amp;gt;addAction(QStringLiteral(&amp;#34;toggle_slideshow&amp;#34;), q, &amp;amp;MainWindow::toggleSlideShow);&#xA;        q-&amp;gt;updateSlideShowAction();&#xA;        connect(mSlideShow, &amp;amp;SlideShow::stateChanged, q, &amp;amp;MainWindow::updateSlideShowAction);&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Cherchons maintenant &lt;code&gt;toggleSlideShow&lt;/code&gt; ici, ce qui nous conduira à cette fonction :&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;void MainWindow::toggleSlideShow()&#xA;{&#xA;    if (d-&amp;gt;mSlideShow-&amp;gt;isRunning()) {&#xA;        d-&amp;gt;mSlideShow-&amp;gt;pause();&#xA;    } else {&#xA;        if (!d-&amp;gt;mViewAction-&amp;gt;isChecked()) {&#xA;            d-&amp;gt;mViewAction-&amp;gt;trigger();&#xA;        }&#xA;        if (!d-&amp;gt;mFullScreenAction-&amp;gt;isChecked()) {&#xA;            d-&amp;gt;mFullScreenAction-&amp;gt;trigger();&#xA;        }&#xA;        QList&amp;lt;QUrl&amp;gt; list;&#xA;        for (int pos = 0; pos &amp;lt; d-&amp;gt;mDirModel-&amp;gt;rowCount(); ++pos) {&#xA;            QModelIndex index = d-&amp;gt;mDirModel-&amp;gt;index(pos, 0);&#xA;            KFileItem item = d-&amp;gt;mDirModel-&amp;gt;itemForIndex(index);&#xA;            MimeTypeUtils::Kind kind = MimeTypeUtils::fileItemKind(item);&#xA;            switch (kind) {&#xA;            case MimeTypeUtils::KIND_SVG_IMAGE:&#xA;            case MimeTypeUtils::KIND_RASTER_IMAGE:&#xA;            case MimeTypeUtils::KIND_VIDEO:&#xA;                list &amp;lt;&amp;lt; item.url();&#xA;                break;&#xA;            default:&#xA;                break;&#xA;            }&#xA;        }&#xA;        d-&amp;gt;mSlideShow-&amp;gt;start(list);&#xA;    }&#xA;    updateSlideShowAction();&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Continuez à chercher &lt;code&gt;mSlideShow&lt;/code&gt;, et vous tomberez ici :&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;struct MainWindow::Private {&#xA;    ...&#xA;    SlideShow *mSlideShow = nullptr;&#xA;    ...&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Nous pouvons maintenant voir que &lt;code&gt;d-&amp;gt;mSlideShow&lt;/code&gt; est de type &lt;code&gt;SlideShow *&lt;/code&gt;. En survolant le nom &lt;code&gt;SlideShow&lt;/code&gt; avec la souris, nous verrons que le type est fourni par &lt;code&gt;lib/slideshow.h&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img alt=&#34;Qt Creator&#34; class=&#34;gallery-image&#34; data-flex-basis=&#34;271px&#34; data-flex-grow=&#34;112&#34; height=&#34;363&#34; loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://rebel1725.codeberg.page/images/pic_20260809_004.png&#34; width=&#34;410&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Ouvrez maintenant &lt;code&gt;lib/slideshow.cpp&lt;/code&gt; et &lt;code&gt;lib/slideshow.h&lt;/code&gt;, et vous êtes prêt.&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>Mes tout premiers pas dans la contribution à la communauté du logiciel libre (projets existants)</title>
            <link>https://rebel1725.codeberg.page/blog/fr/post/the-very-beginning-of-my-journey-contributing-to-the-free-software-community-existing-projects/</link>
            <pubDate>Sun, 02 Aug 2026 23:18:30 +0800</pubDate><author>rebel1725@tilde.club (Rebel Zhang)</author>
            <guid>https://rebel1725.codeberg.page/blog/fr/post/the-very-beginning-of-my-journey-contributing-to-the-free-software-community-existing-projects/</guid>
            <description>&lt;p&gt;Ces derniers jours, j’ai contribué bien moins à la communauté du logiciel libre que je n’en ai bénéficié, et mes contributions se sont limitées à &lt;a class=&#34;link&#34; href=&#34;https://codeberg.org/rebel1725/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;de petits projets personnels simples&lt;/a&gt; ainsi qu’à des contributions non liées au code (comme quelques traductions, le téléversement de quelques captures d’écran sur &lt;a class=&#34;link&#34; href=&#34;https://screenshots.debian.net/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Debian Screenshots&lt;/a&gt;, et la rédaction de billets pour le &lt;a class=&#34;link&#34; href=&#34;https://freeswzhcn.codeberg.page/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Free Software Chinese Site&lt;/a&gt;). Au cours de l’année écoulée, j’ai appris le C/C++, Qt, l’assemblage et un peu de Rust, et je pense qu’il est temps de faire quelque chose de significatif pour la communauté du logiciel libre et le mouvement du logiciel libre.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;AVERTISSEMENT : ceci n’est pas un guide ! Je rédige ce billet uniquement pour partager ma propre expérience. Veuillez consulter la documentation pertinente et demander conseil à des experts pour en apprendre davantage sur la manière de contribuer à la communauté du logiciel libre.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;pourquoi-jai-choisi-kde&#34;&gt;Pourquoi j’ai choisi KDE&#xA;&lt;/h2&gt;&lt;p&gt;À l’origine, j’avais pensé contribuer à postmarketOS. Cependant, j’avais le sentiment que mes compétences étaient bien en deçà de ce qui était nécessaire, et j’ai décidé de commencer par quelque chose de relativement simple. Comme je suis plus familier avec C++ et Qt, j’ai choisi KDE pour ma première contribution à la communauté.&lt;/p&gt;&#xA;&lt;h2 id=&#34;ressenti&#34;&gt;Ressenti&#xA;&lt;/h2&gt;&lt;p&gt;Ma capacité à lire du code source est médiocre. Vers le début de 2025, j’ai essayé de lire le code source de &lt;a class=&#34;link&#34; href=&#34;https://github.com/pdfarranger/pdfarranger&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;PDF Arranger&lt;/a&gt;, et je me suis senti mal à l’aise et submergé.&lt;/p&gt;&#xA;&lt;p&gt;Cependant, grâce à l’expérience de &lt;a class=&#34;link&#34; href=&#34;../a-brief-introduction-into-reverse-engineering&#34; &gt;l’apprentissage du reverse engineering&lt;/a&gt;, qui exige de lire du code assembleur, ma capacité à lire le code source de langages de haut niveau s’est également améliorée. Par conséquent, je pense que je devrais tenter une véritable contribution au logiciel libre afin de mettre mes compétences en pratique dans un environnement réel.&lt;/p&gt;&#xA;&lt;p&gt;Avant d’ouvrir l’arborescence des sources, j’étais quelque peu nerveux, et j’avais peur d’être submergé par le code source, tout comme je l’avais été en lisant le code source de PDF Arranger. Grâce à l’encouragement de mon ami &lt;a class=&#34;link&#34; href=&#34;https://blog.i7arch.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Integral&lt;/a&gt;, j’ai trouvé le courage de franchir ce pas.&lt;/p&gt;&#xA;&lt;h2 id=&#34;outils&#34;&gt;Outils&#xA;&lt;/h2&gt;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://develop.kde.org/docs/getting-started/building/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Un des environnements de développement recommandés par KDE&lt;/a&gt; est la dernière version de Fedora KDE. Comme j’utilise Qubes OS, il m’est très facile de créer rapidement un HVM autonome et d’y effectuer tout mon travail.&lt;/p&gt;&#xA;&lt;p&gt;Ensuite, j’ai configuré &lt;code&gt;kde-builder&lt;/code&gt; conformément à &lt;a class=&#34;link&#34; href=&#34;https://develop.kde.org/docs/getting-started/building/kde-builder-setup/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;la documentation officielle destinée aux développeurs KDE&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;travail&#34;&gt;Travail&#xA;&lt;/h2&gt;&lt;p&gt;J’ai parcouru la &lt;a class=&#34;link&#34; href=&#34;https://bugs.kde.org/buglist.cgi?chfield=%5BBug%20creation%5D&amp;amp;chfieldfrom=7d&amp;amp;f1=product&amp;amp;o1=notequals&amp;amp;v1=Spam&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;liste des bogues&lt;/a&gt; hébergée par &lt;a class=&#34;link&#34; href=&#34;https://bugs.kde.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;le Bugzilla officiel de KDE&lt;/a&gt;. J’ai remarqué &lt;a class=&#34;link&#34; href=&#34;https://bugs.kde.org/show_bug.cgi?id=523617&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;un bogue qui semblait très facile à corriger&lt;/a&gt;, mais après avoir récupéré le code source et compilé le binaire, j’ai constaté que le bogue n’était pas reproductible dans mon environnement avec la dernière version d’Ark.&lt;/p&gt;&#xA;&lt;p&gt;Je suis ensuite retourné à la liste des bogues et j’en ai repéré &lt;a class=&#34;link&#34; href=&#34;https://bugs.kde.org/show_bug.cgi?id=523757&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;un autre&lt;/a&gt; qui semblait anodin. L’environnement système et la version du logiciel indiqués dans le rapport de bogue étaient les mêmes que les miens (Fedora KDE, 26.04), et le bogue était reproductible dans l’application proposée par le dépôt officiel de Fedora. Après l’avoir confirmé, j’ai récupéré le code source et l’ai compilé.&lt;/p&gt;&#xA;&lt;p&gt;J’ai lancé GDB sur le binaire &lt;code&gt;~/kde/build/konsole/bin/konsole&lt;/code&gt;. Après avoir collé la chaîne mentionnée dans le rapport de bogue (&lt;code&gt;calt,liga,ss03, ss07,ss09&lt;/code&gt;) dans le champ, j’ai remarqué cette sortie dans le terminal :&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;The tag name must be exactly 4 characters long!&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Après plusieurs échanges avec un LLM, j’ai trouvé un moyen de localiser la ligne qui affiche cette alerte dans le code source, à l’aide d’un script Python pour GDB :&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;python&#xA;import gdb&#xA;&#xA;TARGET = b&amp;#34;The tag name must be exactly 4 characters long!&amp;#34;&#xA;&#xA;class FilteredWrite(gdb.Breakpoint):&#xA;    def stop(self):&#xA;        fd = int(gdb.parse_and_eval(&amp;#34;$rdi&amp;#34;))&#xA;        if fd not in (1, 2):&#xA;            return False&#xA;&#xA;        buf = int(gdb.parse_and_eval(&amp;#34;$rsi&amp;#34;))&#xA;        count = int(gdb.parse_and_eval(&amp;#34;$rdx&amp;#34;))&#xA;&#xA;        try:&#xA;            data = gdb.selected_inferior().read_memory(buf, count).tobytes()&#xA;        except gdb.MemoryError:&#xA;            return False&#xA;&#xA;        if TARGET in data:&#xA;            gdb.write(&amp;#34;\n=== matched output ===\n&amp;#34;)&#xA;            gdb.write(data.decode(&amp;#34;utf-8&amp;#34;, &amp;#34;replace&amp;#34;) + &amp;#34;\n&amp;#34;)&#xA;            gdb.execute(&amp;#34;bt full&amp;#34;)&#xA;            return True&#xA;&#xA;        return False&#xA;&#xA;FilteredWrite(&amp;#34;write&amp;#34;)&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Après une session GDB, j’ai confirmé que l’alerte provenait du fichier &lt;code&gt;kfontchooser.cpp&lt;/code&gt; dans &lt;code&gt;kwidgetsaddons&lt;/code&gt;. J’ai également trouvé la fonction qui déclenche l’alerte :&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;void KFontChooserPrivate::slotFeaturesChanged(const QString &amp;amp;features)&#xA;{&#xA;    m_selectedFont.clearFeatures();&#xA;&#xA;    if (features.isEmpty()) {&#xA;        return;&#xA;    }&#xA;&#xA;    const QStringList rawFeaturesList = features.split(QLatin1Char(&amp;#39;,&amp;#39;), Qt::SkipEmptyParts);&#xA;    for (const QString &amp;amp;feature : rawFeaturesList) {&#xA;        auto f = QStringView(feature).trimmed();&#xA;        if (f.isEmpty()) {&#xA;            continue;&#xA;        }&#xA;        QList&amp;lt;QStringView&amp;gt; parts = f.split(QStringLiteral(&amp;#34;=&amp;#34;), Qt::SkipEmptyParts);&#xA;        if (parts.length() == 2) {&#xA;            const auto tag = QFont::Tag::fromString(parts[0]);&#xA;            bool ok = false;&#xA;            const int number = parts[1].toInt(&amp;amp;ok);&#xA;            if (tag.has_value() &amp;amp;&amp;amp; ok) {&#xA;                m_selectedFont.setFeature(tag.value(), number);&#xA;            }&#xA;        } else if (f.size() &amp;lt;= 4) {&#xA;            const auto tag = QFont::Tag::fromString(feature);&#xA;            if (tag.has_value()) {&#xA;                m_selectedFont.setFeature(tag.value(), 1);&#xA;            }&#xA;        }&#xA;    }&#xA;&#xA;    Q_EMIT q-&amp;gt;fontSelected(m_selectedFont);&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;J’ai remarqué que le résultat de la séparation était nettoyé :&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;auto f = QStringView(feature).trimmed();&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;mais que la chaîne d’origine, non nettoyée, était toujours utilisée comme tag :&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;const auto tag = QFont::Tag::fromString(feature);&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Cela semble être une erreur commise par le développeur. Pour corriger le problème, il suffit de remplacer la chaîne non nettoyée par la chaîne nettoyée :&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;const auto tag = QFont::Tag::fromString(f);&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Ensuite, il était temps de créer une branche, de valider la modification sur cette branche, puis de soumettre une demande de fusion. Cependant, en raison de ma faible expérience avec Git, j’ai rencontré un problème :&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;warning: redirecting to https://invent.kde.org/rebellfs/kwidgetsaddons.git/&#xA;Enumerating objects: 21973, done.&#xA;Counting objects: 100% (21973/21973), done.&#xA;Delta compression using up to 4 threads&#xA;Compressing objects: 100% (2790/2790), done.&#xA;Writing objects: 100% (21973/21973), 41.17 MiB | ... KiB/s, done.&#xA;Total 21973 (delta 13428), reused 21374 (delta 12884), pack-reused 0 (from 0)&#xA;remote: Resolving deltas: 100% (13428/13428), done.&#xA;remote: Audit failure - Commit 046e4bb16e60b66070ee4a00c368ca6924db3a08 - Email address has an invalid domain : [kde@randomguy3.me.uk](mailto:kde@randomguy3.me.uk)&#xA;remote: Audit failure - Commit 046e4bb16e60b66070ee4a00c368ca6924db3a08 - Email address has an invalid domain : [kde@randomguy3.me.uk](mailto:kde@randomguy3.me.uk)&#xA;remote: Audit failure - Commit c8c7ab3d0e7ca825bbb01d58de005d4d589b12cc - Email address has an invalid domain : [kde@randomguy3.me.uk](mailto:kde@randomguy3.me.uk)&#xA;remote: Audit failure - Commit c8c7ab3d0e7ca825bbb01d58de005d4d589b12cc - Email address has an invalid domain : [kde@randomguy3.me.uk](mailto:kde@randomguy3.me.uk)&#xA;remote: Audit failure - Commit 62e5736a1f4afc2d24ef2c4d643a98bc60e6d6cd - Email address has an invalid domain : [kde@randomguy3.me.uk](mailto:kde@randomguy3.me.uk)&#xA;remote: Audit failure - Commit 62e5736a1f4afc2d24ef2c4d643a98bc60e6d6cd - Email address has an invalid domain : [kde@randomguy3.me.uk](mailto:kde@randomguy3.me.uk)&#xA;remote: Audit failure - Commit f317243c63620acec15a46c412502e73b9a04e2a - Email address has an invalid domain : [kde@randomguy3.me.uk](mailto:kde@randomguy3.me.uk)&#xA;remote: Audit failure - Commit f317243c63620acec15a46c412502e73b9a04e2a - Email address has an invalid domain : [kde@randomguy3.me.uk](mailto:kde@randomguy3.me.uk)&#xA;remote: Push declined - commits failed audit&#xA;remote: Should the audit failures above mention issues regarding your name, please ensure that your Git username has been set to your full name.&#xA;remote: Please see https://git-scm.com/book/en/v2/Getting-Started-First-Time-Git-Setup for more details on ensuring Git has been fully configured.&#xA;remote: In the event that your full name has been set and is shown above as being rejected, please file a Sysadmin ticket at https://go.kde.org/systickets&#xA;To https://invent.kde.org/rebellfs/kwidgetsaddons&#xA;! [remote rejected]     work/rebel1725/fix523757 -&amp;gt; work/rebel1725/fix523757 (pre-receive hook declined)&#xA;error: failed to push some refs to &amp;#39;https://invent.kde.org/rebellfs/kwidgetsaddons&amp;#39;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;En fin de compte, j’ai soumis cette modification via le navigateur, puisqu’il ne s’agissait que d’un changement mineur dans un seul fichier.&lt;/p&gt;&#xA;&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion&#xA;&lt;/h2&gt;&lt;p&gt;Aujourd’hui, j’ai réalisé ma toute première contribution à la communauté du logiciel libre et je suis également devenu un tout nouveau contributeur au logiciel libre. À l’avenir, j’espère contribuer toujours davantage, perfectionner mes compétences et apporter une contribution de plus en plus utile à la communauté ainsi qu’au mouvement du logiciel libre.&lt;/p&gt;&#xA;</description>
        </item></channel>
</rss>
