このページでは

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 は変数を作成する際にauto の変数型を使用します。変数に実際の型をラベル付けするには、[Preferences ] > [C++ ] > [Quick Fixes ]の順に選択し、[Use type "auto" when creating new variables]のチェックを外してください。

関数呼び出し時にも利用可能です。

関数の抽出選択したコードを新しい関数に移動し、そのコードブロックを新しい関数の呼び出しに置き換えます。「Extract Function Refactoring 」ダイアログで関数の名前を入力します。
定数を関数パラメータとして抽出選択したリテラルとそのすべての出現箇所を、元のリテラルをデフォルト値とする関数パラメータ `newParameter` に置き換えます。

クラス

カーソルがクラスの定義上にある場合、以下のクイックフィックスが利用可能です。

クイックフィックス説明
#include を追加プロジェクトファイルに#include ディレクティブを追加し、クラスを利用可能にします。
#include の追加とプロジェクト依存関係の追加#include ディレクティブとパッケージ依存関係をプロジェクトファイルに追加し、未知の Qt クラスを利用可能にします。
定義の追加前方宣言から、空のクラスまたは構造体の定義を作成します。
メンバ関数の実装を作成すべてのメンバ関数の実装を一度に生成します。「Member Function Implementations 」ダイアログで、メンバ関数をインラインで生成するか、クラスの外部で生成するかを指定します。
コンストラクタの生成クラスのコンストラクタを作成します。
Q_PROPERTY の欠落メンバーを生成Q_PROPERTY に欠落しているメンバを追加します:
  • read 関数
  • write 関数。ただし、WRITE
  • onChanged 信号がある場合、NOTIFY
  • という名前のデータメンバーがある場合m_<propertyName>
基底クラスの仮想関数の挿入クラス内部または外部、あるいは実装ファイル(存在する場合)に、宣言および対応する定義を挿入します。詳細については、「仮想関数の挿入」を参照してください。
すべての関数定義を移動すべての関数定義を実装ファイル内またはクラスの外部に移動します。たとえば、次のように書き換えます。
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 の宣言を追加メンバー関数の定義と一致するメンバー関数の宣言を、クラス宣言に挿入します。関数としては、publicprotectedprivatepublic slotprotected 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}
{
    this->bar(42, QString("answer"));
}

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_symbolanExampleSymbol に、AN_EXAMPLE_SYMBOLAnExampleSymbol

数値リテラル

クイックフィックス説明
10進数に変換整数リテラルを10進数表記に変換します。
16進数に変換整数リテラルを16進数表記に変換します
8進数への変換整数リテラルを8進数表記に変換します

演算子

クイックフィックス説明演算子
|| を使用して条件式を書き換えるデ・モルガンの法則に従って式を書き換えます。例えば、次のように書き換えます。
!a && !b

!(a || b)
&&
演算子を使用して書き換える式を否定し、逆演算子を用いて書き換えます。例えば、次のように書き換えます
  • a op b

    次のように

    !(a invop b)
  • (a op b)

    次のように書き換えます

    !(a invop b)
  • !(a op b)

    として

    (a invob 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" など)に、文字列リテラル演算子(QByteArrayLiteralQLatin1CharQLatin1String 、または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()で囲む文字がすでにQLatin1CharQT_TRANSLATE_NOOP 、tr、trUtf8、QLatin1Literal、またはQLatin1String で囲まれていない限り、その文字のエンコーディングをLatin-1に設定します。たとえば、以下のように書き換えます。
'a'

QLatin1Char('a')
QLatin1String()で囲む文字列がすでにQLatin1CharQT_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 はfoo()

担当者
プロジェクトの依存関係を追加プロジェクトファイルに、インクルードされていない 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.