<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Qt on Rebel Zhangs Blog</title>
        <link>https://rebel1725.codeberg.page/blog/de/tags/qt/</link>
        <description>Recent content in Qt 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/qt/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></channel>
</rss>
