我正在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 );
}
// ...
};
与Qt中经常出现的情况一样,有些对象不是QObjects,而是由QObject管理(或者通过QObject访问)。您需要MyObject
监视项目所在的模型。下面的代码可以作为一个起点。
另一种尚未实现但肯定可行的方法是将模型中的所有项动态替换为您自己创建的实例的副本。通过监控相关的模型信号,您可以收到所有项目添加的通知,并将项目替换为您作为工厂的实例。这将是对QStandardItemModel
的薄薄的依赖注入。
开销最低的方法是将信号和插槽从单个对象移动到模型本身,这样您就可以避免可能拥有非常多的 QObjects 的开销,同时仍然保留它们的信号/插槽功能。
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());
}
};
每个数据模型都有关于模型变化的信号,请参阅 QAbstractItemModel 的文档,这就是你需要的。
请注意,QStandardItem
不是QObject
,因此它没有任何信号或插槽。
您能否澄清一下轨道寿命的含义。为什么要对QObject
进行子类?你打算使用SIGNALS
和SLOTs
吗?如果没有,那么我认为它不会有多大用处。除此之外,您还可以使用构造函数和析构函数或合适的函数进行子类QStandardItem
并跟踪生命周期吗?