<?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 Rebel Zhangs Blog</title>
        <link>https://rebel1725.codeberg.page/blog/de/tags/kde/</link>
        <description>Recent content in KDE on Rebel Zhangs Blog</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>de-DE</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/de/tags/kde/index.xml" rel="self" type="application/rss+xml" /><item>
            <title>Die Implementierung einer Funktionalität in einer QtWidgets-Anwendung mit GammaRay finden</title>
            <link>https://rebel1725.codeberg.page/blog/de/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/de/post/find-the-implementation-of-a-function-in-a-qtwidgets-application-using-gammaray/</guid>
            <description>&lt;p&gt;Um Freiheit 1 und Freiheit 3 freier Software auszuüben und/oder zur freien-Software-Community beizutragen, müssen wir den mit einer Funktionalität verbundenen Quellcode ändern, damit die Software etwas anderes tut. Da wir mit einem Projekt jedoch nicht vertraut sind, wissen wir oft nicht, wo sich der Quellcode befindet, den wir ändern müssen. Vielleicht haben Sie Glück, wenn Sie &lt;code&gt;grep -R &amp;lt;some-user-facing-string&amp;gt; .&lt;/code&gt; ausprobieren; manchmal funktioniert das jedoch nicht (siehe &lt;a class=&#34;link&#34; href=&#34;../the-very-beginning-of-my-journey-contributing-to-the-free-software-community-existing-projects&#34; &gt;den vorherigen Beitrag&lt;/a&gt;). In diesem Fall benötigen wir fortgeschrittene Werkzeuge zur Software-Inspektion. Für mit Qt entwickelte Software ist ein leistungsstarkes Hilfswerkzeug &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;Um GammaRay zu verwenden, müssen Sie es zuerst installieren. Wenn Sie Software inspizieren möchten, die aus dem offiziellen Paketarchiv Ihrer Distribution installiert wurde, dann installieren Sie GammaRay ebenfalls von dort:&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;Wenn Sie &lt;code&gt;kde-builder&lt;/code&gt; zur Entwicklung von KDE-Anwendungen verwenden, fügen Sie diese Zeilen zu Ihrer &lt;code&gt;~/.config/kde-builder.yaml&lt;/code&gt; hinzu:&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;und bauen Sie es in Ihr Arbeitsverzeichnis:&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;Um GammaRay zu verwenden, muss die Anwendung, die Sie inspizieren möchten, ausgeführt werden. Starten Sie dann GammaRay und wählen Sie Ihre Anwendung aus der Liste aus.&lt;/p&gt;&#xA;&lt;p&gt;Nehmen wir als Beispiel die Suche nach der Diashow-Logik in Gwenview. Öffnen Sie Gwenview und dann ein Bild; dort sehen Sie die Option &lt;code&gt;Start Slideshow&lt;/code&gt; im Menü:&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;Wenn Sie die Liste der Widgets einzeln durchgehen, werden Sie sehen, dass &lt;code&gt;0x13bda470&lt;/code&gt; das Menü ist, das wir inspizieren möchten und das die Option &lt;code&gt;Start Slideshow&lt;/code&gt; enthält:&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;Und wir werden im Reiter Connections eine &lt;code&gt;toggle_slideshow&lt;/code&gt; QAction sehen:&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; zeigt uns, wo eine solche QAction liegt:&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;Öffnen Sie das Projekt in Ihrer bevorzugten IDE, z. B. Qt Creator, und suchen Sie in &lt;code&gt;app/mainwindow.cpp&lt;/code&gt; nach der Zeichenkette. Wir werden &lt;code&gt;toggle_slideshow&lt;/code&gt; hier finden:&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;Suchen wir nun hier nach &lt;code&gt;toggleSlideShow&lt;/code&gt;, was uns zu dieser Funktion führt:&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;Suchen Sie weiter nach &lt;code&gt;mSlideShow&lt;/code&gt;, und Sie landen hier:&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;Wir sehen nun, dass &lt;code&gt;d-&amp;gt;mSlideShow&lt;/code&gt; vom Typ &lt;code&gt;SlideShow *&lt;/code&gt; ist. Wenn Sie mit der Maus über den Namen &lt;code&gt;SlideShow&lt;/code&gt; fahren, erfahren Sie, dass der Typ von &lt;code&gt;lib/slideshow.h&lt;/code&gt; bereitgestellt wird.&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;Öffnen Sie nun &lt;code&gt;lib/slideshow.cpp&lt;/code&gt; und &lt;code&gt;lib/slideshow.h&lt;/code&gt;, und Sie sind startklar.&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>Meine allerersten Schritte beim Mitwirken an der Freie-Software-Gemeinschaft (bestehende Projekte)</title>
            <link>https://rebel1725.codeberg.page/blog/de/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/de/post/the-very-beginning-of-my-journey-contributing-to-the-free-software-community-existing-projects/</guid>
            <description>&lt;p&gt;In den vergangenen Tagen habe ich der Freie-Software-Gemeinschaft weitaus weniger beigetragen, als ich von ihr profitiert habe, und das, was ich beigetragen habe, beschränkte sich auf &lt;a class=&#34;link&#34; href=&#34;https://codeberg.org/rebel1725/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;kleine, einfache persönliche Projekte&lt;/a&gt; sowie Beiträge ohne Code (etwa einige Übersetzungen, das Hochladen einiger Screenshots auf &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; und das Verfassen von Beiträgen für die &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;). Im vergangenen Jahr habe ich C/C++, Qt, Assemblersprache und etwas Rust gelernt, und ich denke, es ist an der Zeit, etwas Sinnvolles für die Freie-Software-Gemeinschaft und die Freie-Software-Bewegung zu tun.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;HAFTUNGSAUSSCHLUSS: Das ist keine Anleitung! Ich schreibe diesen Beitrag nur, um meine eigenen Erfahrungen zu teilen. Bitte ziehe die einschlägige Dokumentation zu Rate und wende dich an Expertinnen und Experten, um mehr darüber zu erfahren, wie man zur Freie-Software-Gemeinschaft beitragen kann.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;warum-ich-kde-gewählt-habe&#34;&gt;Warum ich KDE gewählt habe&#xA;&lt;/h2&gt;&lt;p&gt;Ursprünglich hatte ich darüber nachgedacht, zu postmarketOS beizutragen. Allerdings hatte ich das Gefühl, dass meine Fähigkeiten bei Weitem nicht ausreichten, und ich beschloss, mit etwas relativ Einfachem zu beginnen. Da ich mit C++ und Qt besser vertraut bin, habe ich KDE für meinen ersten Beitrag zur Gemeinschaft gewählt.&lt;/p&gt;&#xA;&lt;h2 id=&#34;gefühle&#34;&gt;Gefühle&#xA;&lt;/h2&gt;&lt;p&gt;Meine Fähigkeit, Quellcode zu lesen, ist schwach. Etwa Anfang 2025 versuchte ich, den Quellcode von &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; zu lesen, und fühlte mich krank und überwältigt.&lt;/p&gt;&#xA;&lt;p&gt;Dank der Erfahrung aus dem &lt;a class=&#34;link&#34; href=&#34;../a-brief-introduction-into-reverse-engineering&#34; &gt;Erlernen von Reverse Engineering&lt;/a&gt;, das das Lesen von Assemblersprache erfordert, hat sich jedoch auch meine Fähigkeit verbessert, Quellcode in Hochsprachen zu lesen. Deshalb denke ich, dass ich einen echten Beitrag zu Freier Software versuchen sollte, um meine Fähigkeiten in einer realen Umgebung zu üben.&lt;/p&gt;&#xA;&lt;p&gt;Bevor ich den Quellbaum öffnete, war ich etwas nervös, und ich hatte Angst, vom Quellcode überwältigt zu werden, so wie es mir beim Lesen des PDF-Arranger-Quellcodes ergangen war. Dank der Ermutigung meines Freundes &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; fand ich den Mut, diesen Schritt zu gehen.&lt;/p&gt;&#xA;&lt;h2 id=&#34;werkzeuge&#34;&gt;Werkzeuge&#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;Eine der von KDE empfohlenen Entwicklungsumgebungen&lt;/a&gt; ist die neueste Version von Fedora KDE. Da ich Qubes OS verwende, ist es für mich sehr einfach, schnell eine eigenständige HVM einzurichten und meine gesamte Arbeit darin zu erledigen.&lt;/p&gt;&#xA;&lt;p&gt;Danach richtete ich &lt;code&gt;kde-builder&lt;/code&gt; gemäß &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;der offiziellen Dokumentation für KDE-Entwicklerinnen und -Entwickler&lt;/a&gt; ein.&lt;/p&gt;&#xA;&lt;h2 id=&#34;arbeit&#34;&gt;Arbeit&#xA;&lt;/h2&gt;&lt;p&gt;Ich ging die &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;Fehlerliste&lt;/a&gt; durch, die auf &lt;a class=&#34;link&#34; href=&#34;https://bugs.kde.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;KDEs offiziellem Bugzilla&lt;/a&gt; gehostet wird. Mir fiel &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;ein Fehler auf, der sehr leicht zu beheben schien&lt;/a&gt;, aber nachdem ich den Quellcode geholt und das Binärprogramm gebaut hatte, stellte ich fest, dass der Fehler in meiner Umgebung mit der neuesten Version von Ark nicht reproduzierbar war.&lt;/p&gt;&#xA;&lt;p&gt;Dann ging ich zurück zur Fehlerliste und entdeckte &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;einen weiteren Fehler&lt;/a&gt;, der trivial wirkte. Die Systemumgebung und die Softwareversion im Fehlerbericht waren dieselben wie bei mir (Fedora KDE, 26.04), und der Fehler war in der Anwendung aus Fedora&amp;rsquo;s offiziellem Repository reproduzierbar. Nachdem ich das bestätigt hatte, holte ich den Quellcode und baute ihn.&lt;/p&gt;&#xA;&lt;p&gt;Ich startete GDB auf dem Binärprogramm &lt;code&gt;~/kde/build/konsole/bin/konsole&lt;/code&gt;. Nachdem ich die im Fehlerbericht genannte Zeichenkette (&lt;code&gt;calt,liga,ss03, ss07,ss09&lt;/code&gt;) in das Feld eingefügt hatte, sah ich diese Ausgabe in der Konsole:&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;Nach mehreren Gesprächen mit einem LLM fand ich mithilfe eines GDB-Python-Skripts einen Weg, die Zeile im Quellcode zu lokalisieren, die diese Meldung ausgibt:&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;Nach einer GDB-Sitzung bestätigte ich, dass die Warnung aus der Datei &lt;code&gt;kfontchooser.cpp&lt;/code&gt; in &lt;code&gt;kwidgetsaddons&lt;/code&gt; ausgelöst wurde. Ich fand auch die Funktion, die die Warnung auslöst:&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;Mir fiel auf, dass das Ergebnis des Teilens getrimmt wurde:&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;aber die ursprüngliche, nicht getrimmte Zeichenkette weiterhin als Tag verwendet wurde:&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;Das scheint ein Fehler des Entwicklers zu sein. Um das Problem zu beheben, müssen wir nur die nicht getrimmte Zeichenkette durch die getrimmte ersetzen:&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;Danach war es an der Zeit, einen Branch zu erstellen, die Änderung in diesen Branch zu committen und einen Merge Request einzureichen. Aufgrund meiner begrenzten Erfahrung mit Git stieß ich jedoch auf ein Problem:&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;Schließlich reichte ich die Änderung über den Browser ein, da es sich nur um eine triviale Änderung an einer einzigen Datei handelte.&lt;/p&gt;&#xA;&lt;h2 id=&#34;fazit&#34;&gt;Fazit&#xA;&lt;/h2&gt;&lt;p&gt;Heute habe ich meinen allerersten Beitrag zur Freie-Software-Gemeinschaft geleistet und bin zugleich ein brandneuer Freie-Software-Mitwirkender geworden. In Zukunft hoffe ich, immer mehr beizutragen, meine Fähigkeiten zu schärfen und der Gemeinschaft sowie der Freie-Software-Bewegung noch nützlicher zu sein.&lt;/p&gt;&#xA;</description>
        </item></channel>
</rss>
