我在导出到 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()
基础之后,构造的类可能无法使用(即false
为QDBusAbstractInterface
)。
我目前所做的是根据deleteLater()
将isValid()
[2]调用到构造函数中。在我看来,一旦事件循环到达,它最终会在构建后立即导致对象的破坏。
是否允许在deleteLater()
- 派生类的构造函数中调用QObject
槽?
答案 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";
}