I'd say that trying to have a static property that holds QObject pointers is a bad idea without even dwelling about whether it works or not. Qt has another facility for holding hierarchies of objects that you should be using here. If you want to hold some reference to the child object then have that property contain a unique id to the child object that can be used to retrieve the real object pointer for the id.
Something like this should work:
Q_OBJECT
Q_PROPERTY(int id READ id WRITE setId)
Q_PROPERTY(int childId READ childId WRITE setChildId)
public:
// ...
void setId(int id) {
if(m_id == id) return;
if(ObjectManager::instance()->hasId(m_id)) {
ObjectManager::instance()->unregister(m_id);
}
if(ObjectManager::instance()->register(id, this)){
m_id = id;
} else {
qWarning("Id %d already taken. Operation failed.", id);
}
}
void setChildId(int id) {
if(id == m_childId) return;
if(!ObjectManager::instance()->hasId(id)){
qWarning("No object with id %d exists. Operation failed.", id);
return;
}
m_childId = id;
}
};
// ...
QObject* ObjectManager
::objectById(int id
) const { return m_objects.value(id, 0);
}
class MyObject : public QObject {
Q_OBJECT
Q_PROPERTY(int id READ id WRITE setId)
Q_PROPERTY(int childId READ childId WRITE setChildId)
public:
// ...
void setId(int id) {
if(m_id == id) return;
if(ObjectManager::instance()->hasId(m_id)) {
ObjectManager::instance()->unregister(m_id);
}
if(ObjectManager::instance()->register(id, this)){
m_id = id;
} else {
qWarning("Id %d already taken. Operation failed.", id);
}
}
void setChildId(int id) {
if(id == m_childId) return;
if(!ObjectManager::instance()->hasId(id)){
qWarning("No object with id %d exists. Operation failed.", id);
return;
}
m_childId = id;
}
};
// ...
QObject* ObjectManager::objectById(int id) const {
return m_objects.value(id, 0);
}
To copy to clipboard, switch view to plain text mode
provided ObjectManager is a singleton handling registration of objects in the system.
Bookmarks