Trouver l’implémentation d’une fonctionnalité dans une application QtWidgets à l’aide de GammaRay

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

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 grep -R <some-user-facing-string> . ; toutefois, cela ne fonctionnera parfois pas (voir l’article précédent). 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 GammaRay.

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 :

# apt install gammaray

Si vous utilisez kde-builder pour développer des applications KDE, ajoutez ces lignes à votre ~/.config/kde-builder.yaml :

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

puis compilez-le dans votre répertoire de travail :

$ kde-builder gammaray

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.

Prenons comme exemple la recherche de la logique du diaporama dans Gwenview. Ouvrez Gwenview, puis ouvrez une image ; vous verrez alors l’option Start Slideshow dans le menu :

a screenshot of Gwenview

En parcourant la liste des widgets un par un, vous verrez que 0x13bda470 est le menu que nous voulons introspecter, lequel contient l’option Start Slideshow :

GammaRay QtWidgets introspection

Et nous verrons une QAction toggle_slideshow dans l’onglet Connections :

Connections

grep nous indiquera où se trouve une telle QAction :

~/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);

Ouvrez le projet dans votre IDE favori, par exemple Qt Creator, puis recherchez la chaîne dans app/mainwindow.cpp. Nous trouverons ici toggle_slideshow :

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

Cherchons maintenant toggleSlideShow ici, ce qui nous conduira à cette fonction :

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();
}

Continuez à chercher mSlideShow, et vous tomberez ici :

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

Nous pouvons maintenant voir que d->mSlideShow est de type SlideShow *. En survolant le nom SlideShow avec la souris, nous verrons que le type est fourni par lib/slideshow.h.

Qt Creator

Ouvrez maintenant lib/slideshow.cpp et lib/slideshow.h, et vous êtes prêt.

Tildeverse Banner Exchange