0

示例代码在这里。

我在导出到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()is )。falseQDBusAbstractInterface

我目前所做的是将deleteLater()[ 2 ] 调用到构造函数中,具体取决于isValid(). 在我看来,一旦到达事件循环,这最终会导致对象在构建后立即销毁。

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

4

1 回答 1

1

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

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

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";
}
于 2017-08-16T15:03:29.650 回答