C++ 在Qt5代码中禁用旧的(Qt4样式)信号插槽语法

C++ 在Qt5代码中禁用旧的(Qt4样式)信号插槽语法,c++,qt,qt5,c++17,signals-slots,C++,Qt,Qt5,C++17,Signals Slots,是否有任何方法可以防止或阻止在仅用Qt5编写的项目中使用Qt4中的 在我们当前的项目中,没有出现旧语法,我也不认为有任何理由支持它们。因此,我们希望完全禁用它,以防止意外使用。这是否可能,例如通过在.code>pro文件中定义某些符号 我知道这应该是可能的自定义过梁规则,但我们没有集中,但不幸的是 //old way. should throw a compiler error or warning connect(sender, SIGNAL(sig), receiver, SLOT(slt)

是否有任何方法可以防止或阻止在仅用Qt5编写的项目中使用Qt4中的

在我们当前的项目中,没有出现旧语法,我也不认为有任何理由支持它们。因此,我们希望完全禁用它,以防止意外使用。这是否可能,例如通过在.code>pro文件中定义某些符号

我知道这应该是可能的自定义过梁规则,但我们没有集中,但不幸的是

//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")
插槽相同

如果你想把它变成警告。我完全同意你的观点,基于字符串的语法是一种瘟疫,不应该出现在
uic
ed文件之外

如果每个文件中都包含一个公共头,则可以替代项目中的信号宏

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

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

这将在尝试编译Qt4样式的connect语句时显示错误消息。

有一个clang插件,它可以在出现时发出警告,但也有Qt特定的检查。这似乎正是我想要的。问题是,我们的构建环境对所有开发人员来说都不一样,所以大多数开发人员都没有启用clazy。我知道,我们真的应该在这方面努力,只是想知道是否有其他方法只依赖于源代码或项目文件?你不想要它。你没有技术要求。这只是你不合理的愿望。
信号
应该是一个
#define
,因此你应该能够将它重新定义为一条错误消息。这不会破坏到处使用“旧”语法的Qt库代码吗??此外,有时使用旧语法(例如重载信号/插槽)更为方便,但有时可能不得不使用旧样式,因为编译器在构建时不知道信号/插槽签名。老路还没有死。至于那个叮当当当的插件,它只检查*上名为
的自动连接插槽,而不检查
信号/SLOT
宏的用法。这很有效!虽然断言实际显示起来有点复杂:
#undef SIGNAL
#define SIGNAL(x)”,nullptr“”;静态_断言(false,“此项目中已禁用基于字符串的信号/插槽语法”)
@dave你绝对应该发布完整的定义作为答案,我的只是一个基本的想法。正如您在问题上的投票所看到的,很多人都会对此表示欢迎。Qt库头文件中使用了几个
SIGNAL/SLOT
宏的实例,尽管看起来大多数都与QtQuick相关。因此,在处理宏时,可能需要注意这一点。我在
qqmlglobal\u p.h
qquickborderimage\u p.h
qquicktextutil\u p.h
qmediaplaylist\u p.h
qbstractemview\u p.h
(哎哟)中找到了实例。编辑:oh和
qanimationgroup_p.h
qtextstream_p.h
这是一种专业。:)哦,这可能/也会中断QtDesigner/Creator中信号/插槽连接的使用,因为生成的cpp代码使用
signal/slot
宏。对于一些主要的UI部件来说,这不一定是一个很好的实践,但有时也很方便。正如我所说,这段代码将包含在OP的项目文件中,所以它不会影响moc的文件和Qt库。