为什么普通的类方法可以用作Qt中的插槽?

时间:2016-08-29 11:31:20

标签: c++ qt

对于给定的类定义:

class B : public QObject
{
   Q_OBJECT
public:
   void normalFunction(){ qWarning() << "normal function";}
signals:
   void someSignal();
};

有以下代码:

B a;
QObject::connect(&a, &B::someSignal, &a, &B::normalFunction);
a.someSignal();

问题是可以使用普通方法作为插槽 - 没有编译错误,没有运行时警告,事情似乎正常。使用普通方法(这些在slots部分中未声明的方法)作为插槽是否正确?我想在使用函数指针连接信号和插槽时,不会使用moc生成的元数据?

2 个答案:

答案 0 :(得分:2)

是的,这是正确的行为。使用函数指针语法,您可以连接到任何成员函数,而不仅仅是插槽(请参阅 pros 下面的https://wiki.qt.io/New_Signal_Slot_Syntax#New:_connecting_to_QObject_member)。

答案 1 :(得分:1)

  

为什么普通的类方法可以用作Qt中的插槽?

为什么不呢?

  

我想当使用函数指针连接信号和插槽时,不会使用moc生成的元数据?

元数据用于信号,但不用于插槽。新的连接语法并不关心您连接的内容,但绝对关心您连接的内容。如果信号未声明,则连接将在运行时失败,即使它成功编译:

#include <QObject>
struct Test : public QObject {
  Q_SIGNAL void trueSignal();
  void fakeSignal() {}
  Q_OBJECT
};

int main() {
  Test test;
  auto c1 = QObject::connect(&test, &Test::trueSignal, []{}); // succeeds
  auto c2 = QObject::connect(&test, &Test::fakeSignal, []{}); // fails
  Q_ASSERT(c1);
  Q_ASSERT(!c2);
}
#include "main.moc"