在 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。我完全同意你的观点,基于字符串的语法是一种瘟疫,不应该出现在 uiced 文件之外。

基于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 样式的连接语句时显示错误消息。