C++ 快速修复

如果使用Clang 代码模型解析 C++ 文件,则可在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 在创建变量时使用auto 变量类型。要使用实际类型标注变量,请选择首选项>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
}
将类移到一组专用的源文件中将类移到独立的头文件和源文件中。更多信息,请参阅将类移至独立文件
根据声明顺序重新排列成员函数定义按照相应 .h 文件中方法声明的顺序重新排列 .cpp 文件中的方法定义。

类成员

当光标位于类定义中的成员变量上时,可使用以下快速修复方法。

快速修复说明
生成常量Q_PROPERTY 和缺失成员生成常量Q_PROPERTY 并添加缺失的成员。
生成获取函数为成员变量创建获取成员函数。
生成获取器和设置器为成员变量创建 Getter 和 Setter 成员函数。
创建获取和设置成员函数为成员变量创建获取和设置成员函数,或仅创建获取或设置成员函数。
生成Q_PROPERTY 和缺失成员生成Q_PROPERTY 并添加缺失成员。
使用重置函数生成Q_PROPERTY 和缺失成员生成Q_PROPERTY ,并为其添加缺失成员,同时附加reset 函数。
生成设置器为成员变量创建一个 setter 成员函数。

控制语句

快速修复说明
添加大括号为 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 slotprivate 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_symbol 改写为anExampleSymbol ,将AN_EXAMPLE_SYMBOL 改写为AnExampleSymbol

数字字面

快速修复说明
转换为十进制将整数字面转换为十进制表示法
转换为十六进制将整数字面转换为十六进制表示法
转换为八进制将整数字面形式转换为八进制表示形式

操作符

快速修复说明操作符
使用 || 重写条件根据德摩根定律重写表达式。例如,重写
!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
<=,<,>,>=,==,!=,&&||

字符串字面意义

快速修复说明
追加操作符将字符串字面操作符(QByteArrayLiteral,QLatin1Char,QLatin1String, 或QStringLiteral ),如"_ba""_L1" 添加到字符串字面。
转换为字符字面将单字符字符串字面量转换为字符字面量,有一些特殊情况。例如
"a"
"'"
"\n"
"\""

转换为

'a'
'\''
'\n'
'"'
转换为 Objective-C 字符串字面量如果文件类型为 Objective-C(++),则将字符串字面量转换为 Objective-C 字符串字面量。例如,重写以下字符串
"abcd"
QLatin1String("abcd")
QLatin1Literal("abcd")

@"abcd"
转换为字符串字面量将字符字面量转换为字符串字面量,但有一些特殊情况。例如
'a'
'\''
'\n'
'"'

转换为

"a"
"'"
"\n"
"\""
QByteArrayLiteral() 包围将字符串转换为字节数组。例如,重写
"abcd"

改写为

用 QLatin1Char() 包围将一个字符的编码设置为 Latin-1,除非该字符已经包含在QLatin1Char,QT_TRANSLATE_NOOP, tr, trUtf8, QLatin1Literal 或QLatin1String 中。例如,重写
'a'

改写为

QLatin1Char('a')
用 QLatin1String() 包围将字符串的编码设置为 Latin-1,除非该字符串已经包含在QLatin1Char,QT_TRANSLATE_NOOP, tr, trUtf8, QLatin1Literal 或QLatin1String 中。例如,重写
"abcd"

改写为

QLatin1String("abcd")
将字符串字面形式转义为 UTF-8将字符串字面意义中的非 ASCII 字符转义为十六进制转义序列。字符串字面意义按 UTF-8 处理。
标记为可翻译标记字符串为可翻译字符串。例如,使用以下选项之一重写"abcd" ,具体取决于哪个选项可用:
tr("abcd")
QCoreApplication::translate("CONTEXT", "abcd")
QT_TRANSLATE_NOOP("GLOBAL", "abcd")
将字符串字面解码为 UTF-8在字符串字面中取消八进制或十六进制转义序列。字符串字面意义按 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 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;
类型名称或变量名称
下一个/上一个参数切换在参数列表中将参数向下或向上移动一个位置。函数声明或定义中的参数

另请参阅 应用快速修复查找符号重命名符号为快速修复指定设置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.