private:
Button *createButton(const QString &text, const char *member);
void abortOperation();
bool calculate(double rightOperand, const QString &pendingOperator);
Button *pointButton = createButton(tr("."), SLOT(pointClicked()));
在qt的计算器示例中:http://qt-project.org/doc/qt-4.8/widgets-calculator.html
createButton成员函数接受两个常量字符串。那么为什么我们将插槽作为第二个参数传递给他们呢?
答案 0 :(得分:2)
最简单的摘要:创建按钮功能分配一个新按钮,设置文本,然后将该按钮的点击信号连接到您发送的字符串所代表的插槽。
Button *Calculator::createButton(const QString &text, const char *member)
{
Button *button = new Button(text);
//NOTE right here it uses the string you passed in - BEGIN
connect(button, SIGNAL(clicked()), this, member);
//NOTE right here it uses the string you passed in - END
return button;
}
关于为什么信号和插槽宏可以与这样的字符串(per this previous stack overflow post)兼容的更多细节:
正如Neil所说,SLOT和SIGNAL宏被定义为
> #define SLOT(a) "1"#a
> #define SIGNAL(a) "2"#a
#a(带#字符串化运算符)将简单 将括号内的任何内容转换为字符串 literal,用于从提供给宏的签名创建名称。 “1”和“2”仅用于区分插槽和 信号。
这篇早期文章应该为您提供更多见解。
如果你想知道“为什么?”所有这些宏观的东西和 预处理,我建议你阅读 “元对象编译器”或MOC。只是为了好玩,你可以看看 MOC对您提供的代码所做的工作。仔细看看吧 输出并查看它包含的内容。这应该是非常有用的。
简而言之,通过MOC进行的预处理允许Qt实现一些 C ++不提供的功能(如信号和插槽) 标准。 (虽然可以说有一些实现 概念,与Qt无关,不需要元对象 编译器)
希望有所帮助。
请注意我链接的帖子还有其他有价值的链接,复制和粘贴都没有。