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"