为什么Qt在signal/slot中使用无效的类/类型名称引发编译错误?

Mac*_*gma 1 qt visual-studio-2010

Windows 7 SP1
MSVS 2010
Qt库4.8.4 for Windows(VS 2010)
Visual Studio加载项1.1.11 for Qt4

起初,我无法弄清楚为什么这个插槽没有触发:

connect (lineEdit, SIGNAL(textChanged(const QString &)),
         this, SLOT(enableFindButton(const Qstring &)));
Run Code Online (Sandbox Code Playgroud)

差异清楚地表明:Qstring应该是QString.

我的问题:为什么要编译?事实上,它将编译为:

connect (lineEdit, SIGNAL(textChanged(const nonsense &)),
         this, SLOT(enableFindButton(const more_nonsense &)));
Run Code Online (Sandbox Code Playgroud)

这是预期的行为吗?为什么这不会引起错误?

Moi*_*vez 6

据我所知并理解Qt是如何工作的,连接线在运行时工作,而不是在编译时工作.这意味着当代码流到达该部分时,将执行连接信号和插槽所需的所有操作.

记住一些关于Qt的重要事情,一些调用只是宏,而不是C++函数.例如,您应该在类声明中添加"Q_OBJECT"行以启用信号和插槽机制,这是一个宏.此外,连接调用是一个宏(...),发出是一个宏等.一旦MOC(一个预编译器,将Qt宏转换为实际代码)分析您的代码,这些调用将扩展为实际代码.

另外,据我所知,我重复的信号/插槽机制是在运行时工作,而不是编译时.如果您阅读了连接宏的文档,它会说放在那里的"SIGNAL"和"SLOT"宏,将你放在那里的东西转换成字符串,显然,使用某种格式,这可能太复杂了手工使用,因此,由于它是一个在那里工作的字符串,编译无法检查字符串是否正确,在运行时检查.

我希望我的英语不好让你理解我,我希望我的知识足够大,不会说(太多)不正确的语言.

  • 当Q_OBJECT宏扩展到QMetaObject时,MOC似乎完全忽略了SIGNAL/SLOT宏.信号和插槽的连接留给运行时并实现为简单的字符串匹配(SIGNAL和SLOT宏扩展为`const char*`). (2认同)