为什么插槽作为字符串传递?铂醇


 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 成员函数采用两个常量字符串。那为什么我们要把插槽作为第二个参数传递给他们呢?

最简单的摘要:创建按钮函数分配一个新按钮,设置文本,然后将该按钮的单击信号连接到用您发送的字符串表示的插槽。

     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;
     }

关于为什么信号和插槽宏与这样的字符串兼容的更多细节(根据之前的堆栈溢出帖子(:

正如Neil所说,SLOT和SIGNAL宏定义为

> #define SLOT(a) "1"#a
> #define SIGNAL(a) "2"#a 

#a(带有 # 字符串化运算符(将简单地 将括号内的任何内容转换为字符串 文本,从提供给宏的签名创建名称。 "1"和"2"只是为了区分插槽和 信号。

这篇较早的帖子应该会为您提供更多见解。

如果你想知道所有这些宏观内容的"为什么?"和 预处理,我建议您阅读 "元对象编译器"或MOC。只是为了好玩,你可以看看 MOC 对您提供给它的代码执行的操作。查看其 输出并查看它包含的内容。这应该很有信息量。

简而言之,这种通过MOC的预处理允许Qt实现一些 C++不提供的功能(如信号和插槽( 标准。(尽管可以说有一些实现 概念,与Qt无关,不需要元对象 编译器(

希望有帮助。

请注意,我链接的帖子还有其他有价值的链接,这些链接不是通过复制和粘贴的。

最新更新