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 オプションが表示されます。

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

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

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 で提供されていることが分かります。

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
















































