1

Windows 7 SP1
MSVS 2010
Qt 库 4.8.4 for Windows (VS 2010)
Visual Studio Add-in 1.1.11 for Qt4

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

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 &)));

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

4

1 回答 1

6

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

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

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

我希望我糟糕的英语能让你理解我,我希望我的知识足够丰富,不会说(太多)不正确的东西。

于 2012-12-29T00:57:36.437 回答