C++のクイックフィックス
C++ファイルを解析するためにClangコードモデルを使用する場合、Edit モードでClang修正ヒントを得ることができます。クイックフィックスを有効にする標準的な方法を使うか、コードエディタの左マージンにあるコンテキストメニューで行に適用可能なフィックスを選択します。
以下のタイプのクイック修正をC++コードに適用します:
- バイナリ・オペランドの変更
- if条件とwhile条件の簡素化(たとえば、宣言をif条件の外に移動する)
- 文字列を修正する(文字列のエンコードをLatin-1に設定する、文字列を翻訳可能にマークする、シンボル名をキャメルケースに変換するなど)。
- 変数宣言の作成
- 関数の宣言と定義の作成
次の表は、カーソルの位置に応じて C++ コードで使用できるクイックフィックスをまとめたものです。
選択したコードブロック
| クイックフィックス | 説明 |
|---|---|
| ローカル変数への代入 | 関数呼び出しの戻り値や新しい式を格納するローカル変数を追加します。例えばQString s; s.toLatin1(); として書き換えます。 QString s; QByteArray latin1 = s.toLatin1(); そして new Foo;として Foo * localFoo = new Foo; デフォルトでは、Qt Creator は変数作成時に 関数呼び出しでも使用できます。 |
| 関数の抽出 | 選択したコードを新しい関数に移動し、コードのブロックを新しい関数の呼び出しで置き換えます。Extract Function Refactoring ダイアログで関数の名前を入力します。 |
| 関数パラメータとして定数を抽出 | 選択したリテラルとそのすべての出現回数を、元のリテラルをデフォルト値とする関数パラメータnewParameter で置き換えます。 |
クラス
カーソルがクラスの定義上にある場合、以下のクイック・フィックスを使用できます。
| クイック修正 | 説明 |
|---|---|
| define の追加 | #include ディレクティブをプロジェクト・ファイルに追加して、クラスを利用可能にします。 |
| include およびプロジェクト依存の追加 | 未知の Qt クラスを利用可能にするために、プロジェクトファイルに#include ディレクティブとパッケージ依存を追加します。 |
| メンバ関数の実装の作成 | すべてのメンバ関数の実装を一度に作成します。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 の生成とリセット関数による欠落メンバの追加 | reset 関数を追加して、Q_PROPERTY を生成し、欠落しているメンバを追加します。 |
| セッターの生成 | メンバ変数のセッター・メンバ関数を作成します。 |
制御ステートメント
| クイックフィックス | 説明 |
|---|---|
| 中括弧の追加 | 中括弧を 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); } |
| 中括弧の削除 | 単一のステートメントで構成されるブロックから中括弧を削除します。 |
| 完全なスイッチ文 | enum 型の switch 文に可能なすべてのケースを追加します。 |
| 条件から宣言を移動 | if 条件または while 条件から宣言を移動して、条件を簡略化します。例えばif (Type name = foo()) {} として書き換える。 Type name = foo; if (name) {} |
| ループの最適化 | ポストインクリメント演算子をプレインクリメント演算子に、ポストデクリメント演算子をプレデクリメント演算子に書き換える。また、文字列や数値以外のリテラルや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() {
}
};として(クラス外) Class Foo {
void bar();
};
void Foo::bar()
{
}として(実装ファイル内) // 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 4QObject::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つ下または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.
