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

时间:2012-12-29 00:43:52

标签: visual-studio-2010 qt

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

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

connect (lineEdit, SIGNAL(textChanged(const QString &)),
         this, SLOT(enableFindButton(const Qstring &)));

差异说清楚:Qstring应该是QString。

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

connect (lineEdit, SIGNAL(textChanged(const nonsense &)),
         this, SLOT(enableFindButton(const more_nonsense &)));

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

1 个答案:

答案 0 :(得分:6)

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

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

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

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