是的:
由于槽是普通的成员函数,因此在直接调用时它们遵循普通的 C++ 规则。<...> 您还可以将插槽定义为虚拟的,我们发现这在实践中非常有用。
http://qt-project.org/doc/qt-4.8/signalsandslots.html#slots
在您的示例Derived::f
中是一个普通的虚函数。如果直接调用它,它会按预期工作,就像文档中所说的那样。当被信号调用时,被调用,qt_static_metacall
生成moc_Derived.cpp
如下:
void Derived::qt_static_metacall(QObject *_o, QMetaObject::Call _c,
int _id, void **_a)
{
if (_c == QMetaObject::InvokeMetaMethod) {
Q_ASSERT(staticMetaObject.cast(_o));
Derived *_t = static_cast<Derived *>(_o);
switch (_id) {
case 0: _t->f(); break;
default: ;
}
}
Q_UNUSED(_a);
}
因此,它以正常的函数调用结束_t->f()
。
请注意,无法Base::f
通过信号调用。Base
仅当当前对象实际上是实例而不是实例时,才能执行此函数Derived
。而且由于Base
不是基于 QObject 的,因此您不能将其实例传递给connect
函数。