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 在创建变量时使用 auto 变量类型。要使用实际的变量类型标记变量,请选择《翻译不正确的链接》> C++ > 快速修复,并清除创建新变量时使用“auto”类型

也适用于函数调用。

提取函数将选定的代码移动到新函数中,并用对新函数的调用替换代码块。在《翻译不正确的链接》> 提取函数重构对话框中输入函数的名称。
将常量作为函数参数提取用默认值为原始常量的函数参数 newParameter 替换选定的文字及其所有出现。

当光标位于类的定义上时,以下快速修复可用。

快速修复说明
为成员函数创建实现一次生成所有成员函数的实现。在《翻译不正确的链接》> 成员函数实现对话框中,指定是否在类内或外部生成成员函数。
生成构造函数为类创建构造函数。
生成缺失的 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 并向其中添加缺失成员。
生成 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 声明将匹配的成员函数声明插入到类声明中。函数可以是publicprotectedprivatepublic slotprotected 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
<=<>>===!=&&||

字符串文字

快速修复说明
转换为Objective-C字符串文字当文件类型为Objective-C(++)"时,将字符串文字转换为Objective-C字符串文字。例如,重写以下字符串:
"abcd"
QLatin1String("abcd")
QLatin1Literal("abcd")

@"abcd"
QByteArrayLiteral()括起来将字符串转换为字节数组。例如,重写以下内容:
"abcd"

QLatin1Char()括起来设置字符的编码为 Latin-1,除非字符已经被以下之一封装:QLatin1CharQT_TRANSLATE_NOOP,tr,trUtf8,QLatin1Literal 或 QLatin1String。例如,重写
'a'

QLatin1Char('a')
使用 QLatin1String() 封装设置字符串的编码为 Latin-1,除非字符串已经被以下之一封装:QLatin1CharQT_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() 的返回类型

赋值表达式
将 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;
类型名称或变量名称
使用下一个/上一个参数切换将参数在参数列表中向上或向下移动一个位置。函数声明或定义中的参数

另请参阅 应用快速修复查找符号重命名单符号指定快速修复的设置QML 快速修复快速修复

©2024 年 The Qt Company Ltd. 的文档贡献是各自所有者的版权。本提供的文档是根据自由软件基金会发布的、以 GNU 自由文档许可证版本 1.3 条款许可的。Qt 以及相应的标志是 The Qt Company Ltd. 在芬兰和/或其他国家的商标。所有其他商标均为各自所有者的财产。