我在QStandardItemModel上写了一些包装器。是否可以跟踪QStandardItems的生命周期(删除事件)?
我认为唯一的方法是互相交换QObject + QStandardItem。但出于某些原因我不想这样做。
更新
当从模型中删除此项目时,我需要删除包含指向QStandardItem的指针的对象。
这是解决方案。但是我想对外部(不是我的)QStandardItem做同样的事情。
class ItemWrap : public QObject, public QStandardItem
{
// ...
};
class MyObject : public QObject
{
MyObject( ItemWrap *item ) // I need MyObject( QStandardItem *item )
{
connect( item, &QObject::destroyed, this, &MyObject::deletelater );
}
// ...
};
答案 0 :(得分:1)
每个数据模型都有关于模型变化的信号,请参阅QAbstractItemModel的文档,这就是您所需要的。
请注意,QStandardItem
不是QObject
,因此它没有任何信号或广告位。
答案 1 :(得分:1)
与Qt中的情况一样,有些对象不是QObject,而是由QObject管理(或者通过其他方式访问)。您需要MyObject
监控项目所在的模型。下面的代码可能是一个起点。
另一种未实现但当然可行的方法是使用您自己创建的实例的副本动态替换模型中的所有项目。通过监视相关的模型信号,您可以收到所有项目添加的通知,并使用您作为工厂的实例替换项目。这将是一个薄薄的依赖注入QStandardItemModel
。
最低开销的方法是将信号和插槽从单个对象移动到模型本身,这样可以避免可能包含很多QObject的开销,同时仍保留其信号/插槽功能。
class MyObject : public QObject {
Q_OBJECT
QStandardItem * m_item;
Q_SLOT void onRowsAboutToBeRemoved(const QModelIndex & parent, int start, int end) {
if (m_item->parent() == parent &&
m_item->index().row() >= start &&
m_item->index().row() <= end) onItemGone;
}
Q_SLOT void onColumnsAboutToBeRemoved(const QModelIndex & parent, int start, int end) {
if (m_item->parent() == parent &&
m_item->index().column() >= start &&
m_item->index().column() <= end) onItemGone;
}
Q_SLOT void onItemGone() {
m_item = 0;
deleteLater();
}
public:
MyObject(QStandardItem* item, QObject * parent = 0) :
QObject(parent), m_item(item)
{
Q_ASSERT(m_item.model());
connect(m_item.model(), SIGNAL(rowsAboutToBeRemoved(QModelIndex,int,int)),
SLOT(onRowsAboutToBeRemoved(QModelIndex,int,int)));
connect(m_item.model(), SIGNAL(columnsAboutToBeRemoved(QModelIndex,int,int)),
SLOT(onColumnsAboutToBeRemoved(QModelIndex,int,int)));
connect(m_item.model(), SIGNAL(modelAboutToBeReset()), SLOT(onItemGone());
connect(m_item.model(), SIGNAL(destroyed()), SLOT(onItemGone());
}
};
答案 2 :(得分:0)
请您澄清追踪生命周期的含义。
为什么要继承QObject
?
你打算使用SIGNALS
和SLOTs
吗?如果不是,那么我认为它不会有多大用处。
除此之外,您可以继承QStandardItem
并使用您的构造函数和析构函数或合适的函数来跟踪生命周期吗?