概要
Qt Creatorで作成したQt WidgetsプロジェクトをVisual Studio Codeで開いたときにclangdの補完機能を有効にするための設定方法を備忘録として書き残しておきます。
以下で説明する設定を行うことで、下の画像のようにVisual Studio Codeからclangdの補完機能を呼び出せるようになります。
リポジトリ例はGitHubにも上げてあるので、併せて参照してください。
https://github.com/ishioka0222/qt-vscode-clangd
動作を確認した環境
- Windows 11 Home 22H2
- Visual Studio Code v1.74.3
- clangd v0.1.23
- Qt 6.4.2
clangdの補完機能を有効にする方法
QtやVisual Studio Code、clangdの拡張機能のインストールは済んでいるものとします。
-
Qt Creatorからウィザードに従ってQt Widgetsプロジェクトを作成します(Qt Quickでも動くかもしれませんが、確認していません)。
-
プロジェクトが作成されたら、プロジェクトディレクトリをVisual Studio Codeで開きます。
この段階では、clangdはQt関連のヘッダファイルを認識していません。 -
clangdのインクルードディレクトリの設定を行います。
プロジェクトのルートディレクトリに.clangd
というファイル名でclangdの設定ファイルを作成します。
ファイルの中身は以下のようにします(--include-directory
の行は、各自でQtをインストールしたディレクトリに読み替えてください)。.clangdCompileFlags: Add: - "-std=c++17" - "--include-directory=C:\\Qt\\6.4.2\\msvc2019_64\\include" - "--include-directory=C:\\Qt\\6.4.2\\msvc2019_64\\include\\QtGui" - "--include-directory=C:\\Qt\\6.4.2\\msvc2019_64\\include\\QtCore" - "--include-directory=C:\\Qt\\6.4.2\\msvc2019_64\\include\\QtWidgets"
現在のQtはデフォルトでC++17を使用しているらしく、
-std=c++17
の指定がないとエラーが出ます。
QtSqlなど、Qtから提供されている追加のモジュールを使用している場合は、- "--include-directory=C:\\Qt\\6.4.2\\msvc2019_64\\include\\QtSql"
のように行を追加する必要があります。この設定ファイルの詳細については以下のclangdの公式ドキュメントを参照してください。
https://clangd.llvm.org/config
--include-directory
などのオプションの詳細については以下のclangの公式ドキュメントを参照してください。
https://clang.llvm.org/docs/ClangCommandLineReference.html -
Visual Studio Codeのclangdの拡張機能ではデフォルトでは
.clangd
の設定ファイルは読み込まれない設定になっているようなので、.clangd
を読み込むための設定を行います。
まず、Visual Studio Codeの設定画面を開きます。
設定はUser設定でもWorkspace設定でもどちらでも問題ないと思いますが、ここではWorkspace設定を選択した場合の説明を行います。
Workspace
のタブをクリックし、clangd.arguments
で検索するとClangd: Arguments
という設定項目が出てきます。
Add Item
をクリックして、--enable-config
と入力して、OKを押します。
設定が完了したら以下の画像のような状態になります。
-
clangdの設定はlanguage serverを再起動させないと反映されないため、Visual Studio Codeのコマンドパレットから
clangd: Restart language server
を実行します。 -
すると、Visual Studio Codeの右下に設定を読み込むか確認するダイアログが出てくるので、
Yes, use this setting
をクリックします。 -
これでclangdがQtのインクルードディレクトリを認識し、最初に出ていたようなエラーは出なくなります。
補完機能も動作していることが分かります。
(ちなみに、この記事を執筆中、clangdのlanguage serverを再起動させるところで、たまにエラーになることがありました。その場合は何度かVisual Studio Codeを再起動させたら治りましたが、原因は不明です……。)
補足
Qtのフォームのデザインを.ui
ファイルで編集している場合、clangdが.ui
ファイルから生成されたヘッダーファイルを認識せず、その部分だけ以下のようなエラーが出ます。
これを回避するには、以下のようにします。
-
.ui
ファイルをQt Creatorで編集したらビルドを行い、.ui
ファイルに対応するヘッダーファイルを生成する。 -
プロジェクトのルートディレクトリと同じ階層に
build-qt-vscode-clangd-Desktop_Qt_6_4_2_MSVC2019_64bit-Debug
のような名前のビルドディレクトリが生成されていることを確認する。 -
.clangd
に、上で確認したビルドディレクトリをインクルードする設定を追加する。
具体的には以下のようにすればOKです(ディレクトリは各自で読み替えてください)。CompileFlags: Add: - "-std=c++17" - "--include-directory=C:\\Qt\\6.4.2\\msvc2019_64\\include" - "--include-directory=C:\\Qt\\6.4.2\\msvc2019_64\\include\\QtGui" - "--include-directory=C:\\Qt\\6.4.2\\msvc2019_64\\include\\QtCore" - "--include-directory=C:\\Qt\\6.4.2\\msvc2019_64\\include\\QtWidgets" - "--include-directory=C:\\Users\\hiroki\\source\\repos\\build-qt-vscode-clangd-Desktop_Qt_6_4_2_MSVC2019_64bit-Debug"
-
これで
ui_mainwindow.h
のような.ui
ファイルから生成されるファイルのインクルードによるエラーも消えます。