我在导出到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 )。false
QDBusAbstractInterface
我目前所做的是将deleteLater()
[ 2 ] 调用到构造函数中,具体取决于isValid()
. 在我看来,一旦到达事件循环,这最终会导致对象在构建后立即销毁。
是否允许在派生类的构造函数中调用deleteLater()
槽?QObject