はい:
スロットは通常のメンバー関数であるため、直接呼び出された場合は通常の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
ます。また、はQObjectベースではないため、そのインスタンスを関数Base
に渡すことはできません。connect