对于给定的类定义:
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生成的元数据?
答案 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"