C++のクイックフィックス
Clang コードモデルを使用して C++ ファイルを解析する場合、Edit モードでClang の修正ヒントが表示されます。クイックフィックスを有効にする標準的な方法を使用するか、コードエディタの左マージンにあるコンテキストメニューから、該当する行の修正を選択してください。
C++ コードには、以下の種類のクイックフィックスを適用できます:
- 二項演算子の変更
- if および while の条件を簡略化する(例:if 条件から宣言を移動する)
- 文字列の修正(例:文字列のエンコーディングをLatin-1に設定、文字列を翻訳可能としてマーク、シンボル名をキャメルケースに変換)
- 変数宣言の作成
- 関数の宣言および定義の作成
以下の表は、カーソルの位置に応じて C++ コードで利用可能なクイックフィックスをまとめたものです。
選択されたコードブロック
| クイックフィックス | 説明 |
|---|---|
| ローカル変数への代入 | 関数呼び出しやnew式の結果を格納するローカル変数を追加します。例えば、次のように書き換えます。QString s; s.toLatin1(); を QString s; QByteArray latin1 = s.toLatin1(); と書き換え、 new Foo;として Foo * localFoo = new Foo; デフォルトでは、Qt Creator は変数を作成する際に 関数呼び出し時にも利用可能です。 |
| 関数の抽出 | 選択したコードを新しい関数に移動し、そのコードブロックを新しい関数の呼び出しに置き換えます。「Extract Function Refactoring 」ダイアログで関数の名前を入力します。 |
| 定数を関数パラメータとして抽出 | 選択したリテラルとそのすべての出現箇所を、元のリテラルをデフォルト値とする関数パラメータ `newParameter` に置き換えます。 |
クラス
カーソルがクラスの定義上にある場合、以下のクイックフィックスが利用可能です。
| クイックフィックス | 説明 |
|---|---|
| #include を追加 | プロジェクトファイルに#include ディレクティブを追加し、クラスを利用可能にします。 |
| #include の追加とプロジェクト依存関係の追加 | #include ディレクティブとパッケージ依存関係をプロジェクトファイルに追加し、未知の Qt クラスを利用可能にします。 |
| 定義の追加 | 前方宣言から、空のクラスまたは構造体の定義を作成します。 |
| メンバ関数の実装を作成 | すべてのメンバ関数の実装を一度に生成します。「Member Function Implementations 」ダイアログで、メンバ関数をインラインで生成するか、クラスの外部で生成するかを指定します。 |
| コンストラクタの生成 | クラスのコンストラクタを作成します。 |
| Q_PROPERTY の欠落メンバーを生成 | Q_PROPERTY に欠落しているメンバを追加します:
|
| 基底クラスの仮想関数の挿入 | クラス内部または外部、あるいは実装ファイル(存在する場合)に、宣言および対応する定義を挿入します。詳細については、「仮想関数の挿入」を参照してください。 |
| すべての関数定義を移動 | すべての関数定義を実装ファイル内またはクラスの外部に移動します。たとえば、次のように書き換えます。class Foo { void bar() { // do stuff here } void baz() { // do stuff here } }; を class Foo { void bar(); void baz(); }; void Foo::bar() { // do stuff here } void Foo::baz() { // do stuff here } |
| クラスを専用のソースファイル群に移動する | クラスを個別のヘッダーファイルとソースファイルに移動します。詳細については、「クラスを個別のファイルに移動する」を参照してください。 |
| 宣言順に従ってメンバ関数の定義を並べ替える | .cpp ファイル内のメソッド定義を、対応する.h ファイル内のメソッド宣言の順序に合わせて並べ替えます。 |
クラスのメンバ
クラス定義内のメンバ変数にカーソルを置いている場合、以下のクイックフィックスが利用可能です。
| クイックフィックス | 説明 |
|---|---|
| 定数Q_PROPERTY および欠落しているメンバーを生成 | 定数 `Q_PROPERTY ` を生成し、欠落しているメンバを追加します。 |
| ゲッターを生成 | メンバ変数用のゲッターメンバ関数を作成します。 |
| ゲッターとセッターの生成 | メンバ変数に対して、ゲッターおよびセッターのメンバ関数を作成します。 |
| ゲッターおよびセッターのメンバ関数の生成 | メンバ変数に対して、ゲッターとセッターの両方のメンバ関数を生成するか、ゲッターまたはセッターのいずれか一方のみを生成します。 |
| Q_PROPERTY および欠落しているメンバの生成 | Q_PROPERTY を生成し、そこに欠落しているメンバを追加します。 |
| Q_PROPERTY と欠落メンバーを生成(リセット関数付き) | Q_PROPERTY を生成し、欠落しているメンバを追加するとともに、reset 関数を追加します。 |
| セッターの生成 | メンバ変数用のセッターメンバ関数を作成します。 |
制御文
| クイックフィックス | 説明 |
|---|---|
| 中括弧の追加 | if節、またはdo、while、forループに中括弧を追加します。たとえば、if節を次のように書き換えます。if (a) b; else c; を if (a) { b; } else { c; } doループを次のように書き換えます do ++i; while (i < 10); を do { ++i; } while (i < 10); whileループを書き換える while (i > 0) --i; を while (i > 0) { --i; } forループを書き換える for (int i = 0; i < 10; ++i) func(i); を for (int i = 0; i < 10; ++i) { func(i); } |
| 中括弧を削除 | 単一の文で構成されるブロックから中括弧を削除します。 |
| switch文の完成 | enum 形式の switch 文に、考えられるすべてのケースを追加します。 |
| 宣言を条件文の外へ移動 | if または while の条件式から宣言を移動し、条件式を簡略化します。たとえば、次のように書き換えます。if (Type name = foo()) {} を Type name = foo; if (name) {} |
| forループの最適化 | ポストインクリメント演算子をプレインクリメント演算子に、ポストデクリメント演算子をプレデクリメント演算子に書き換えます。また、文字列や数値リテラル、ID式以外の式を、forループの条件式から初期化式に移動します。例えば、次のように書き換えます。for (int i = 0; i < 3 * 2; i++) を for (int i = 0, total = 3 * 2; i < total; ++i) |
関数の宣言または定義
| クイックフィックス | 説明 |
|---|---|
| 定義の追加... | 関数宣言に対する定義のスタブを、ヘッダーファイル(クラス内またはクラス外)または実装ファイルに挿入します。フリー関数の場合、関数の宣言の直後、または実装ファイル内に定義を挿入します。修飾名は、常に完全に展開されるのではなく、可能な場合は短縮されます。 たとえば、次のように書き換えます。 Class Foo {
void bar();
};を次のように書き換えます(クラス内) Class Foo {
void bar() {
}
};as(クラス外) Class Foo {
void bar();
};
void Foo::bar()
{
}as(実装ファイル内) // Header file Class Foo { void bar(); }; // Implementation file void Foo::bar() { } |
Function の宣言を追加 | メンバー関数の定義と一致するメンバー関数の宣言を、クラス宣言に挿入します。関数としては、public 、protected 、private 、public slot 、protected slot 、またはprivate slot が指定可能です。 |
| 変更を適用 | 関数のシグネチャを編集する際に、対応する宣言または定義を確認し、その変更を対応するコードに反映させることで、関数の宣言と定義を同期させます。 この修正が利用可能な場合、電球のアイコンが表示されます: |
| 関数呼び出しを Qt メタメソッド呼び出しに変換 | 呼び出し可能な関数呼び出しをメタメソッドの呼び出しに変換します。これは、一般的なシグナルやスロットに加え、Q_INVOKABLE で明示的にマークされた関数にも適用されます。たとえば、次のクラスの場合:class Foo : public QObject { Q_OBJECT public: explicit Foo(QObject *parent = nullptr); Q_SLOT void pubBar(int i); private: Q_INVOKABLE void bar(int i, const QString &c); }; 書き換え を Foo::Foo(QObject *parent) : QObject{parent} { QMetaObject::invokeMethod(this, "bar", Q_ARG(int, 42), Q_ARG(QString, QString("answer"))); } このクイックフィックスは、呼び出し元から可視であるクラス外の呼び出し可能なメソッドに対しても機能します。例えば、次のように書き換えます。 Foo f; f.pubBar(123); を Foo f; QMetaObject::invokeMethod(&f, "pubBar", Q_ARG(int, 123)); |
| 定義をここに移動 | 既存の関数定義をその宣言箇所へ移動します。 |
| 関数定義の移動 | 関数の定義を、実装ファイル内、クラスの外、または宣言箇所へ移動します。たとえば、次のように書き換えます。class Foo { void bar() { // do stuff here } }; を class Foo { void bar(); }; void Foo::bar() { // do stuff here } |
| 関数のドキュメントを宣言/定義に移動 | 関数のドキュメントコメントを、その宣言と定義の間に移動します。 |
識別子
| クイックフィックス | 説明 |
|---|---|
| 未宣言または前方宣言された識別子に対して #include を追加 | #include ディレクティブを現在のファイルに追加し、シンボルの定義を利用可能にします。 |
| クラスメンバの追加 | 初期化されているクラスメンバがまだ宣言されていない場合、そのメンバの宣言を追加します。Qt Creator がメンバのデータ型を自動的に検出できない場合は、手動で追加する必要があります。 |
| 定義の追加 | 静的データメンバの定義スタブを挿入します。 |
| 前方宣言の追加 | 未宣言の識別子または演算子に対して、前方宣言を追加します。 |
| キャメルケースに変換 | シンボル名をキャメルケースに変換します。キャメルケースでは、名前の各要素が区切り文字なしで連結され、各要素の先頭文字が大文字になります。たとえば、an_example_symbol はanExampleSymbol に、AN_EXAMPLE_SYMBOL はAnExampleSymbol |
数値リテラル
| クイックフィックス | 説明 |
|---|---|
| 10進数に変換 | 整数リテラルを10進数表記に変換します。 |
| 16進数に変換 | 整数リテラルを16進数表記に変換します |
| 8進数への変換 | 整数リテラルを8進数表記に変換します |
演算子
| クイックフィックス | 説明 | 演算子 |
|---|---|---|
| || を使用して条件式を書き換える | デ・モルガンの法則に従って式を書き換えます。例えば、次のように書き換えます。!a && !b を !(a || b) | && |
| 演算子を使用して書き換える | 式を否定し、逆演算子を用いて書き換えます。例えば、次のように書き換えます
| <=、< 、> 、>= 、== 、または!= |
| if文の分割 | if文を複数の文に分割します。例えば、次のように書き換えます。if (something && something_else) { } を if (something) { if (something_else) { } } と書き換え、 if (something || something_else) x; と if (something) x; else if (something_else) x; | && または|| |
| オペランドの入れ替え | 逆演算子を使用して、式を逆の順序で書き換えます。例えば、次のように書き換えます。a op b を b flipop a | <=、< 、> 、>= 、== 、!= 、&& 、あるいは|| |
文字列リテラル
| クイックフィックス | 説明 |
|---|---|
| 追加演算子 | 文字列リテラル("_ba" や"_L1" など)に、文字列リテラル演算子(QByteArrayLiteral 、QLatin1Char 、QLatin1String 、またはQStringLiteral )を追加します。 |
| 文字リテラルへの変換 | 1文字の文字列リテラルを、いくつかの特例を除き、文字リテラルに変換します。例えば、"a" "'" "\n" "\"" は、 'a' '\'' '\n' '"' |
| Objective-C 文字列リテラルへの変換 | ファイルの種類が Objective-C(++) の場合、文字列リテラルを Objective-C の文字列リテラルに変換します。たとえば、以下の文字列を次のように書き換えます"abcd" QLatin1String("abcd") QLatin1Literal("abcd") を @"abcd" |
| 文字列リテラルへの変換 | 文字リテラルを文字列リテラルに変換します。ただし、いくつかの特例があります。例えば、'a' '\'' '\n' '"' は、それぞれ "a" "'" "\n" "\"" |
| QByteArrayLiteral() で囲む | 文字列をバイト配列に変換します。たとえば、次のように書き換えます"abcd"を QByteArrayLiteral("abcd") |
| QLatin1Char()で囲む | 文字がすでにQLatin1Char 、QT_TRANSLATE_NOOP 、tr、trUtf8、QLatin1Literal、またはQLatin1String で囲まれていない限り、その文字のエンコーディングをLatin-1に設定します。たとえば、以下のように書き換えます。'a'を QLatin1Char('a') |
| QLatin1String()で囲む | 文字列がすでにQLatin1Char 、QT_TRANSLATE_NOOP 、tr、trUtf8、QLatin1Literal、またはQLatin1String で囲まれていない限り、その文字列のエンコーディングをLatin-1に設定します。たとえば、以下のように書き換えます。"abcd"を QLatin1String("abcd") |
| 文字列リテラルをUTF-8としてエスケープする | 文字列リテラル内の非ASCII文字を16進数のエスケープシーケンスに変換します。文字列リテラルはUTF-8として扱われます。 |
| 翻訳可能としてマーク | 文字列を翻訳可能としてマークします。たとえば、"abcd" を、利用可能なオプションに応じて、以下のいずれかのオプションで書き換えます:tr("abcd") QCoreApplication::translate("CONTEXT", "abcd") QT_TRANSLATE_NOOP("GLOBAL", "abcd") |
| UTF-8 文字列リテラルからエスケープを解除 | 文字列リテラル内の8進または16進のエスケープシーケンスを解除します。文字列リテラルはUTF-8として扱われます。 |
using ディレクティブ
| クイックフィックス | 説明 |
|---|---|
グローバルスコープ内の「using namespace 」をすべて削除し、型名を適宜修正する | グローバルスコープ内の `using namespace ` のすべての出現箇所を削除し、それに応じて型名を調整します。 |
using namespace を削除し、型名を適宜修正する | ローカルスコープ内の `using namespace ` の出現箇所を削除し、それに応じて型名を修正してください。 |
その他
| クイックフィックス | 説明 | 有効化 |
|---|---|---|
| ローカル宣言の追加 | 代入式の右辺の型がわかっている場合、代入先の型を追加します。例えば、以下のように書き換えます。a = foo();を Type a = foo();と書き換えます。ここで、Type は | 担当者 |
| プロジェクトの依存関係を追加 | プロジェクトファイルに、インクルードされていない Qt ファイルの不足しているパッケージ依存関係を追加します。 | Qt クラスの #include 文 |
| connect() を Qt 5 スタイルに変換 | Qt 4のQObject::connect()をQt 5スタイルに変換します。 | QObject::connect() (Qt 4 スタイル) |
| コメントを C/C++ スタイルに変換 | C スタイルのコメントを C++ スタイルのコメントに変換し、その逆も同様に行います。見やすいレイアウトを維持するよう努め、Doxygen や qdoc の書式設定も考慮しますが、結果の整理が必要な場合があります。 | コードコメント |
| ポインタへの変換 | 選択したスタック変数をポインタに変換します。例えば、次のように書き換えます。QByteArray foo = "foo"; foo.append("bar"); を QByteArray *foo = new QByteArray("foo"); foo->append("bar"); この操作は関数スコープ内でのみ有効です。また、ポインタおよび参照に関するコーディングスタイルはまだサポートされていません。 | スタック変数 |
| スタック変数への変換 | 選択したポインタをスタック変数に変換します。例えば、次のように書き換えます。QByteArray *foo = new QByteArray("foo"); foo->append("bar"); を QByteArray foo("foo"); foo.append("bar"); この操作は関数スコープ内でのみ有効です。また、ポインタおよび参照に関するコーディングスタイルはまだサポートされていません。 | ポインタ変数 |
| ポインタまたは参照の再フォーマット | ポインタまたは参照を含む宣言を、現在のプロジェクトのコードスタイル設定に従って再フォーマットします。プロジェクトが開かれていない場合は、現在のグローバルなコードスタイル設定が使用されます。 たとえば、次のように書き換えます。 char*s; を char *s; 選択範囲に適用すると、その範囲内の該当するすべての宣言が書き換えられます。 | ポインタや参照を含む宣言、およびそのような宣言を含む選択範囲 |
| 宣言の分割 | 単純な宣言を複数の宣言に分割します。たとえば、次のように書き換えます。int *a, b; を int *a; int b; | 型名または変数名 |
| 「次/前のパラメータ」による切り替え | パラメータリスト内でパラメータを1つ分上下に移動します。 | 関数の宣言または定義内のパラメータ |
関連項目: クイックフィックスの適用、シンボルの検索、シンボルの名前変更、クイックフィックスの設定、QML クイックフィックス、およびクイックフィックス。
Copyright © The Qt Company Ltd. and other contributors. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.
