LoginSignup
0

posted at

updated at

Qt WidgetsプロジェクトでVisual Studio Codeのclangdの補完機能を有効にする方法

概要

Qt Creatorで作成したQt WidgetsプロジェクトをVisual Studio Codeで開いたときにclangdの補完機能を有効にするための設定方法を備忘録として書き残しておきます。

以下で説明する設定を行うことで、下の画像のようにVisual Studio Codeからclangdの補完機能を呼び出せるようになります。

2023-01-29_15-31-36_00_modified.png

リポジトリ例は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の拡張機能のインストールは済んでいるものとします。

  1. Qt Creatorからウィザードに従ってQt Widgetsプロジェクトを作成します(Qt Quickでも動くかもしれませんが、確認していません)。

  2. プロジェクトが作成されたら、プロジェクトディレクトリをVisual Studio Codeで開きます。
    この段階では、clangdはQt関連のヘッダファイルを認識していません。

  3. clangdのインクルードディレクトリの設定を行います。
    プロジェクトのルートディレクトリに.clangdというファイル名でclangdの設定ファイルを作成します。
    ファイルの中身は以下のようにします(--include-directoryの行は、各自でQtをインストールしたディレクトリに読み替えてください)。

    .clangd
    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"
    

    現在の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

    .clangdファイルを作成した状態のフォルダ構成は下の画像のようになります。

  4. Visual Studio Codeのclangdの拡張機能ではデフォルトでは.clangdの設定ファイルは読み込まれない設定になっているようなので、.clangdを読み込むための設定を行います。
    まず、Visual Studio Codeの設定画面を開きます。
    設定はUser設定でもWorkspace設定でもどちらでも問題ないと思いますが、ここではWorkspace設定を選択した場合の説明を行います。
    Workspaceのタブをクリックし、clangd.argumentsで検索するとClangd: Argumentsという設定項目が出てきます。
    Add Itemをクリックして、--enable-configと入力して、OKを押します。
    設定が完了したら以下の画像のような状態になります。

  5. clangdの設定はlanguage serverを再起動させないと反映されないため、Visual Studio Codeのコマンドパレットからclangd: Restart language serverを実行します。

  6. すると、Visual Studio Codeの右下に設定を読み込むか確認するダイアログが出てくるので、Yes, use this settingをクリックします。

  7. これでclangdがQtのインクルードディレクトリを認識し、最初に出ていたようなエラーは出なくなります。

    補完機能も動作していることが分かります。

    (ちなみに、この記事を執筆中、clangdのlanguage serverを再起動させるところで、たまにエラーになることがありました。その場合は何度かVisual Studio Codeを再起動させたら治りましたが、原因は不明です……。)

補足

Qtのフォームのデザインを.uiファイルで編集している場合、clangdが.uiファイルから生成されたヘッダーファイルを認識せず、その部分だけ以下のようなエラーが出ます。

これを回避するには、以下のようにします。

  1. .uiファイルをQt Creatorで編集したらビルドを行い、.uiファイルに対応するヘッダーファイルを生成する。

  2. プロジェクトのルートディレクトリと同じ階層にbuild-qt-vscode-clangd-Desktop_Qt_6_4_2_MSVC2019_64bit-Debugのような名前のビルドディレクトリが生成されていることを確認する。

  3. .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"
    
  4. これでui_mainwindow.hのような.uiファイルから生成されるファイルのインクルードによるエラーも消えます。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
0