Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么普通类方法可以用作Qt中的插槽?_C++_Qt - Fatal编程技术网

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

C++ 为什么普通类方法可以用作Qt中的插槽?,c++,qt,C++,Qt,对于给定的类定义: class B : public QObject { Q_OBJECT public: void normalFunction(){ qWarning() << "normal function";} signals: void someSignal(); }; 问题是,可以使用普通方法作为插槽—没有编译错误,没有运行时警告,似乎一切正常。使用常规方法(这些方法未在slot部分中声明)作为slot是否正确?我猜当使用函数指针连接信号和插槽时,m

对于给定的类定义:

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

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

是的,这是正确的行为。使用函数指针语法,您可以连接到任何成员函数,而不仅仅是插槽(请参见下文)

为什么普通类方法可以用作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"
#包括
结构测试:公共QObject{
Q_信号无效真信号();
void fakeSignal(){}
Q_对象
};
int main(){
试验;
auto c1=QObject::connect(&test,&test::trueSignal,[]{});//成功
自动c2=QObject::connect(&test,&test::fakeSignal,[]{});//失败
Q_断言(c1);
Q_断言(!c2);
}
#包括“main.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"