是否可以将基本非 QObject 类的虚函数槽化
Is it ok to slotify virtual function of base non-QObject class
如果我在基本的非 QObject 类中声明一个函数虚拟,然后将其作为派生类中的一个插槽覆盖,该类具有Q_OBJECT宏并且将 QObject 作为基类之一,它应该可以正常工作吗?
是否可以保证虚拟通话有效?如果连接到派生类的槽,会发生什么情况?
class Base
{
public:
virtual void f();
};
class Derived: public QObject, public Base
{
Q_OBJECT
public slots:
virtual void f();
};
是:
由于插槽是正常的成员函数,因此它们遵循正常的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
函数。
相关文章:
- QObject::连接不起作用 - 使用函数语法找不到信号
- 将复制构造函数设置为默认值在继承自 QObject 时不起作用
- 将QMETAMETHOD作为参数传递到使用新的Qobject :: Connect语法的函数
- 如何在 exec 循环停止后正确使用 QSharedPointer 的析构函数<QObject>?
- QObject::使用update()函数连接计时器
- 如果从 QObject 派生的类的构造函数抛出,则将发出 destroy()
- 如果对QObject::connect()使用lambda函数,则使用gcc编译失败
- 无法连接Qt QObject::connect()函数
- 调用移动到Qt中不同线程的QObject函数?
- 从基于QObject的类继承构造函数
- 跨线程从QML调用QObject函数
- 是否可以将基本非 QObject 类的虚函数槽化
- QObject::connect 周围的函数包装器
- Qt 线程,来自 QObject 的析构函数的崩溃移动
- 在 Qt5 中,从 QML 调用公共 QObject 函数Q_INVOKABLE需要吗?
- 如何使用新的QObject::连接语法与函数指针将QSslSocket::错误信号连接到插槽
- 从 QObject 继承类中的 winsock 连接函数
- 定义自己的析构函数,尽管类派生自QObject
- QObject派生的类回调函数到c库
- 使用QObject::connect()时,类型签名是否重要,用于将函数连接到信号