GammaRay を使って QtWidgets アプリケーション内の機能の実装箇所を見つける

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

フリーソフトウェアの自由 1 と自由 3 を実践したり、フリーソフトウェアコミュニティに貢献したりするには、ある機能に関連するソースコードを変更して、ソフトウェアに別の動作をさせる必要があります。しかし、私たちはプロジェクトに慣れていないため、変更すべきソースコードがどこにあるのか分からないことがよくあります。grep -R <some-user-facing-string> . を試してみてうまく見つかることもありますが、うまくいかない場合もあります(前回の記事 を参照)。そのような場合には、高度なソフトウェア内省ツールが必要です。Qt で開発されたソフトウェアには、GammaRay という強力なユーティリティがあります。

GammaRay を使うには、まずインストールする必要があります。ディストリビューションの公式リポジトリからインストールしたソフトウェアを内省したい場合は、GammaRay もそこからインストールしてください。

# apt install gammaray

KDE アプリケーションの開発に kde-builder を使っている場合は、~/.config/kde-builder.yaml に次の行を追加します。

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

そして、作業ディレクトリにビルドします。

$ kde-builder gammaray

GammaRay を使うには、内省したいアプリケーションを起動しておく必要があります。次に GammaRay を起動し、一覧からアプリケーションを選びます。

例として、Gwenview のスライドショーのロジックを見つけてみましょう。Gwenview を開き、画像を開くと、メニューに Start Slideshow オプションが表示されます。

a screenshot of Gwenview

Widgets の一覧を一つずつ見ていくと、0x13bda470 が内省したいメニューであり、その中に Start Slideshow オプションが含まれていることが分かります。

GammaRay QtWidgets introspection

そして、Connections タブに toggle_slideshow QAction があるのが見えます。

Connections

grep なら、そのような 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);

お気に入りの IDE、たとえば Qt Creator でプロジェクトを開き、app/mainwindow.cpp 内の文字列を検索してください。ここで toggle_slideshow が見つかります。

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

次に toggleSlideShow を検索すると、この関数にたどり着きます。

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

続けて mSlideShow を検索すると、ここにたどり着きます。

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

これで d->mSlideShow の型が SlideShow * であることが分かります。SlideShow という文字列にマウスを重ねると、その型が lib/slideshow.h で提供されていることが分かります。

Qt Creator

では、lib/slideshow.cpplib/slideshow.h を開いて、作業を進めましょう。

Tildeverse Banner Exchange