C++ 快速修复
如果您使用 Clang 代码模型 解析 C++ 文件,您将在 编辑 模式中获得 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 在创建变量时使用 也适用于函数调用。 |
提取函数 | 将选定的代码移动到新函数中,并用对新函数的调用替换代码块。在《翻译不正确的链接》> 提取函数重构对话框中输入函数的名称。 |
将常量作为函数参数提取 | 用默认值为原始常量的函数参数 newParameter 替换选定的文字及其所有出现。 |
类
当光标位于类的定义上时,以下快速修复可用。
快速修复 | 说明 |
---|---|
为成员函数创建实现 | 一次生成所有成员函数的实现。在《翻译不正确的链接》> 成员函数实现对话框中,指定是否在类内或外部生成成员函数。 |
生成构造函数 | 为类创建构造函数。 |
生成缺失的 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 并向其中添加缺失成员。 |
生成 Getter | 为成员变量创建 Getter 成员函数。 |
生成 Getter 和 Setter | 为成员变量创建 Getter 和 Setter 成员函数。 |
创建 Getter 和 Setter 成员函数 | 为成员变量创建 Getter 和 Setter 成员函数,或者只创建 Getter 或 Setter。 |
生成 Q_PROPERTY 和缺失成员 | 生成一个 Q_PROPERTY 并向其中添加缺失成员。 |
生成 Q_PROPERTY 和缺失成员,含重置函数 | 生成一个 Q_PROPERTY 并向其中添加缺失成员,另外包含一个 reset 函数。 |
生成 Setter | 为成员变量创建 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); } |
完成 switch 语句 | 向类型为 enum 的 switch 语句添加所有可能的 case。 |
将声明移出条件 | 将声明从 if 或 while 条件中移出,以简化条件。例如,重写if (Type name = foo()) {} 为 Type name = foo; if (name) {} |
优化 for 循环 | 将后增量运算符重写为前增量运算符,并将后减量运算符重写为前减量运算符。它还将除了字符串或数值字面量以外的其他表达式从 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 | <= 、< 、> 、>= 、== 、!= 、&& 或|| |
字符串文字
快速修复 | 说明 |
---|---|
转换为Objective-C字符串文字 | 当文件类型为Objective-C(++)"时,将字符串文字转换为Objective-C字符串文字。例如,重写以下字符串:"abcd" QLatin1String("abcd") QLatin1Literal("abcd") 为 @"abcd" |
用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 是 | 赋值表达式 |
将 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; | 类型名称或变量名称 |
使用下一个/上一个参数切换 | 将参数在参数列表中向上或向下移动一个位置。 | 函数声明或定义中的参数 |
©2024 年 The Qt Company Ltd. 的文档贡献是各自所有者的版权。本提供的文档是根据自由软件基金会发布的、以 GNU 自由文档许可证版本 1.3 条款许可的。Qt 以及相应的标志是 The Qt Company Ltd. 在芬兰和/或其他国家的商标。所有其他商标均为各自所有者的财产。