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 在创建变量时使用 也可用于函数调用。 |
提取函数 | 将所选代码移至新函数,并用对新函数的调用替换代码块。在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 } |
将类移到一组专用的源文件中 | 将类移到独立的头文件和源文件中。更多信息,请参阅将类移至独立文件。 |
根据声明顺序重新排列成员函数定义 | 按照相应 .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 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 |
数字字面
快速修复 | 说明 |
---|---|
转换为十进制 | 将整数字面转换为十进制表示法 |
转换为十六进制 | 将整数字面转换为十六进制表示法 |
转换为八进制 | 将整数字面形式转换为八进制表示形式 |
操作符
快速修复 | 说明 | 操作符 |
---|---|---|
使用 || 重写条件 | 根据德摩根定律重写表达式。例如,重写!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 | <= ,< ,> ,>= ,== ,!= ,&& 或|| |
字符串字面意义
快速修复 | 说明 |
---|---|
追加操作符 | 将字符串字面操作符(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" 改写为 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 是 | 被指定人 |
添加项目依赖 | 为项目文件中缺失的 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; | 类型名称或变量名称 |
下一个/上一个参数切换 | 在参数列表中将参数向下或向上移动一个位置。 | 函数声明或定义中的参数 |
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.