在Qt5代码中禁用旧的(Qt4样式)Signal-Slot语法

dav*_*ave 10 c++ qt signals-slots qt5 c++17

有什么方法可以防止或不鼓励在仅以Qt5编写的项目中使用来自Qt4 旧Signal-Slot语法

在我们当前的项目中,没有出现旧语法,我也没有任何理由支持它们。因此,我们想完全禁用它以防止意外使用。这是可能的,例如通过在中定义某些符号。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);
Run Code Online (Sandbox Code Playgroud)

Tom*_*ica 8

如果您在项目中有一个共享头文件,可以确保将其包含在之后QObject,则可以执行以下操作:

#define SIGNAL(x) static_assert(false, "String-based signal/slot syntax has been disabled in this project")
Run Code Online (Sandbox Code Playgroud)

相同SLOT

如果您想将其变成警告,请查看此答案。我绝对同意您的观点,基于字符串的语法是一种困扰,不应在uiced文件之外出现。

  • 这样可行!尽管要使断言实际显示起来要复杂一些:#undef SIGNAL` #define SIGNAL(x)“”,nullptr,“”); static_assert(false,“此项目中已禁用基于字符串的信号/插槽语法”);` (2认同)

dav*_*ave 3

基于这个答案

如果每个文件中都包含公共标头,则可以覆盖项目中的 SIGNAL 宏。

确保它在Qt/QObject 包含之后包含。

#undef SIGNAL
#define SIGNAL(x) "",nullptr,""); static_assert(false, "String-based signal/slot syntax has been disabled in this project");
Run Code Online (Sandbox Code Playgroud)

当尝试编译 Qt4 样式的连接语句时,这将显示错误消息。