在 Qt5 代码中禁用旧的(Qt4 风格的)Signal-Slot 语法
Disable old (Qt4-style) Signal-Slot syntax in Qt5 code
有什么方法可以防止或阻止在仅用 Qt5 编写的项目中使用 Qt4 中的 old Signal-Slot syntax?
在我们当前的项目中,没有出现旧语法,我也没有看到任何支持它们的理由。因此我们想完全禁用它以防止意外使用。这可能吗,例如通过在 .pro
文件中定义某些符号?
我知道这应该可以通过自定义 Linter 规则实现,但不幸的是我们还没有集中化。
//old way. should throw a compiler error or warning
connect(sender, SIGNAL(sig), receiver, SLOT(slt));
//new way
connect(sender, &Send::sig, receiver, &Rec::slt);
如果你的项目中有共享头文件,你可以确保在QObject
之后包含,你可以这样做:
#define SIGNAL(x) static_assert(false, "String-based signal/slot syntax has been disabled in this project")
与 SLOT
相同。
如果你想把它变成警告,check out this answer。我完全同意你的观点,基于字符串的语法是一种瘟疫,不应该出现在 uic
ed 文件之外。
基于this answer.
如果每个文件中都包含一个通用 header,则可以覆盖项目中的 SIGNAL 宏。
确保在 Qt/QObject 包含 之后 包含它。
#undef SIGNAL
#define SIGNAL(x) "",nullptr,""); static_assert(false, "String-based signal/slot syntax has been disabled in this project");
这将在尝试编译 Qt4 样式的连接语句时显示错误消息。
有什么方法可以防止或阻止在仅用 Qt5 编写的项目中使用 Qt4 中的 old Signal-Slot syntax?
在我们当前的项目中,没有出现旧语法,我也没有看到任何支持它们的理由。因此我们想完全禁用它以防止意外使用。这可能吗,例如通过在 .pro
文件中定义某些符号?
我知道这应该可以通过自定义 Linter 规则实现,但不幸的是我们还没有集中化。
//old way. should throw a compiler error or warning
connect(sender, SIGNAL(sig), receiver, SLOT(slt));
//new way
connect(sender, &Send::sig, receiver, &Rec::slt);
如果你的项目中有共享头文件,你可以确保在QObject
之后包含,你可以这样做:
#define SIGNAL(x) static_assert(false, "String-based signal/slot syntax has been disabled in this project")
与 SLOT
相同。
如果你想把它变成警告,check out this answer。我完全同意你的观点,基于字符串的语法是一种瘟疫,不应该出现在 uic
ed 文件之外。
基于this answer.
如果每个文件中都包含一个通用 header,则可以覆盖项目中的 SIGNAL 宏。
确保在 Qt/QObject 包含 之后 包含它。
#undef SIGNAL
#define SIGNAL(x) "",nullptr,""); static_assert(false, "String-based signal/slot syntax has been disabled in this project");
这将在尝试编译 Qt4 样式的连接语句时显示错误消息。