QObject*和void*之间的转换

Converting between QObject* and void*

本文关键字:转换 之间 void QObject      更新时间:2023-10-16

我正在使用QT 5.7,由于我必须使用的库,我需要将QObject(派生类)转换为void指针。

有几个定义。我有一个只接受void指针的函数,并且我的类派生自QObject:

void oneFunction(void *obj);
class MyObj : public QObject
{
    ...
};

然后创建并填充一个对象:

MyObj *ptr = new MyObj(parent);
ptr->.......

在某些时候,我将其转换为void指针,因为我必须将其传递给函数。这个强制转换是自动完成的:

oneFunction(ptr);

然后,一段时间后,我接收回我传递的指针,我需要将它转换回原始类。

函数没有修改指针。
void callbackFromOneFunction(void *theOldPointer)
{
    MyObj *oldPtr = qobject_cast<MyObj*>(static_cast<QObject*>(theOldPointer));
    if (oldPtr != nullptr)
    {
        ... Now it's back, so use it
    }
}

现在,整个过程是正确的吗?你发现什么问题了吗?有没有更好的解决方案?

谢谢

我认为一个static_cast就足够了。

static_cast不会在运行时检查类型,应该在您确定类型正确时使用。在这种情况下,你是肯定的,你不需要qobject_castqobject_cast在运行时检查类型(类似于dynamic_cast)。


目标类型已知的情况下

static_cast或c风格的强制转换是可以的。尽管c风格的强制转换在这里工作得很好,但不建议这样做,因为:

  • c风格的强制类型转换不被编译器检查,而static_cast类型转换被检查。
  • static_cast s更具可读性,可以更容易地搜索。
  • 更多信息。

如果目标类型未知

  • 当源类型为QObject *或其派生时,单个qobject_cast就足够了。

  • 如果源类型为多态性,则使用dynamic_cast。换句话说,dynamic_cast仅用于多态源类型(即至少具有一个虚函数的类)。在这类中,在编译时不能确定指向具有虚方法的基类的指针的最派生类型,只有在运行时才能确定。

    关于动态强制转换void*,允许强制转换到,但不能强制转换自。

在您的情况下,void*没有任何RTTI,因此qobject_castdynamic_cast都不能使用

如果 只有如果你确定指针没有并且永远不会被oneFunction(void*)以未定义的方式触摸,那么在程序的其他地方强制转换接收该指针并将其类型强制转换回QObject是安全的。看到这个。

在这种情况下,这是完全有效的:

void callbackFromOneFunction(void *theOldPointer)
{
    MyObj *oldPtr = qobject_cast<MyObj*>(static_cast<QObject*>(theOldPointer));
    if (oldPtr != nullptr)
    {
        ... Now it's back, so use it
    }
}