为什么插槽作为字符串传递? Qt的

时间:2015-02-18 03:25:31

标签: c++ qt

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

1 个答案:

答案 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无关,不需要元对象   编译器)

     

希望有所帮助。

请注意我链接的帖子还有其他有价值的链接,复制和粘贴都没有。