Die Implementierung einer Funktionalität in einer QtWidgets-Anwendung mit GammaRay finden

2026-08-09T20:49:33+08:00

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 grep -R <some-user-facing-string> . ausprobieren; manchmal funktioniert das jedoch nicht (siehe den vorherigen Beitrag). In diesem Fall benötigen wir fortgeschrittene Werkzeuge zur Software-Inspektion. Für mit Qt entwickelte Software ist ein leistungsstarkes Hilfswerkzeug GammaRay.

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:

# apt install gammaray

Wenn Sie kde-builder zur Entwicklung von KDE-Anwendungen verwenden, fügen Sie diese Zeilen zu Ihrer ~/.config/kde-builder.yaml hinzu:

project gammaray:
  repository: https://github.com/KDAB/GammaRay.git

und bauen Sie es in Ihr Arbeitsverzeichnis:

$ kde-builder gammaray

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.

Nehmen wir als Beispiel die Suche nach der Diashow-Logik in Gwenview. Öffnen Sie Gwenview und dann ein Bild; dort sehen Sie die Option Start Slideshow im Menü:

a screenshot of Gwenview

Wenn Sie die Liste der Widgets einzeln durchgehen, werden Sie sehen, dass 0x13bda470 das Menü ist, das wir inspizieren möchten und das die Option Start Slideshow enthält:

GammaRay QtWidgets introspection

Und wir werden im Reiter Connections eine toggle_slideshow QAction sehen:

Connections

grep zeigt uns, wo eine solche QAction liegt:

~/kde/src/gwenview$ grep -R toggle_slideshow
app/fullscreencontent.cpp:    addAction(QStringLiteral("toggle_slideshow"));
app/gwenviewui.rc:        <Action name="toggle_slideshow" />
app/mainwindow.cpp:        mToggleSlideShowAction = view->addAction(QStringLiteral("toggle_slideshow"), q, &MainWindow::toggleSlideShow);

Öffnen Sie das Projekt in Ihrer bevorzugten IDE, z. B. Qt Creator, und suchen Sie in app/mainwindow.cpp nach der Zeichenkette. Wir werden toggle_slideshow hier finden:

        mToggleSlideShowAction = view->addAction(QStringLiteral("toggle_slideshow"), q, &MainWindow::toggleSlideShow);
        q->updateSlideShowAction();
        connect(mSlideShow, &SlideShow::stateChanged, q, &MainWindow::updateSlideShowAction);

Suchen wir nun hier nach toggleSlideShow, was uns zu dieser Funktion führt:

void MainWindow::toggleSlideShow()
{
    if (d->mSlideShow->isRunning()) {
        d->mSlideShow->pause();
    } else {
        if (!d->mViewAction->isChecked()) {
            d->mViewAction->trigger();
        }
        if (!d->mFullScreenAction->isChecked()) {
            d->mFullScreenAction->trigger();
        }
        QList<QUrl> list;
        for (int pos = 0; pos < d->mDirModel->rowCount(); ++pos) {
            QModelIndex index = d->mDirModel->index(pos, 0);
            KFileItem item = d->mDirModel->itemForIndex(index);
            MimeTypeUtils::Kind kind = MimeTypeUtils::fileItemKind(item);
            switch (kind) {
            case MimeTypeUtils::KIND_SVG_IMAGE:
            case MimeTypeUtils::KIND_RASTER_IMAGE:
            case MimeTypeUtils::KIND_VIDEO:
                list << item.url();
                break;
            default:
                break;
            }
        }
        d->mSlideShow->start(list);
    }
    updateSlideShowAction();
}

Suchen Sie weiter nach mSlideShow, und Sie landen hier:

struct MainWindow::Private {
    ...
    SlideShow *mSlideShow = nullptr;
    ...
}

Wir sehen nun, dass d->mSlideShow vom Typ SlideShow * ist. Wenn Sie mit der Maus über den Namen SlideShow fahren, erfahren Sie, dass der Typ von lib/slideshow.h bereitgestellt wird.

Qt Creator

Öffnen Sie nun lib/slideshow.cpp und lib/slideshow.h, und Sie sind startklar.

Tildeverse Banner Exchange