将deleteLater用于QObject派生类

时间:2017-08-16 14:53:17

标签: qt qml qtquick2 dbus networkmanager

Example code is here.

我在导出到 QML 的C ++对象中发现了一些类似于指针类型属性的习惯用法。由于外部事件的发生,这些属性的指示可以随时停止存在。我为此目的使用QObject::deleteLater个插槽。 <property>Changed信号(QML要求)可以连接到QObject::destroyed信号。我已经注意到,在发出这个信号的那一刻QPointer已经很清楚了。所以财产价值恰好在QML方面有效。

查看QPointer标题我注意到它基于QWeakPointer / QSharedPointer并且似​​乎已使用行为(即“QPointer在调用连接到的第一个广告位之前变得清晰destroyed信号“)在某种程度上是硬件设置,但未在文档中指定。

在我的案例中,属性是指向QDBusAbstractInterface的派生类[1]的指针,它们对应于 NetworkManager D-Bus 服务接口。 NetworkManager D-Bus 服务可能会意外取消注册,并且所有上述类都无法使用,并且QDBusAbstractInterface::isValid()每个类都变为false

QDBusAbstractInterface - 生成它们的派生类的生命周期中,我可以通过QDBusServiceWatcher观察者来管理这种情况。

但是在创建QDBusAbstractInterface - 派生类时,我不能依赖服务可用性。即使我通过QDBusConnection::systemBus().interface()->isServiceRegistered(QStringLiteral(NM_DBUS_SERVICE))检查服务的可用性,它也会在下一个运算符(就C ++而言)之前立即变得不可用。因此,在构造其QDBusAbstractInterface::isValid()基础之后,构造的类可能无法使用(即falseQDBusAbstractInterface)。

我目前所做的是根据deleteLater()isValid() [2]调用到构造函数中。在我看来,一旦事件循环到达,它最终会在构建后立即导致对象的破坏。

是否允许在deleteLater() - 派生类的构造函数中调用QObject槽?

1 个答案:

答案 0 :(得分:1)

  

是否允许在构造函数中调用deleteLater()槽   QObject派生类?

这只是不寻常和不明显的(类消费者可能不会期望)处理无效对象的方法,我们总是可以在使用class-factory模式创建类之前检测类的实例是否有效:

class MyNetworkManager
{
public:
   // static create method
   static MyNetworkManager* create();

private:
   // private constructor
   MyNetworkManager();
};

/*static*/ MyNetworkManager* MyNetworkManager::create()
{
   // This method may contain all the necessary logic
   // to avoid producing an invalid class instance.
   if (nwkSystem.isReady())
       retrun new MyNetworkManager;

   return nullptr;
}

// usage would be
auto* p = MyNetworkManager::create();
if (!p)
{
    qDebug() << "the system is not ready for MyNetworkManager";
}