Qt 跟踪QS标准项寿命

Qt 跟踪QS标准项寿命,qt,qabstractitemmodel,qstandarditemmodel,qstandarditem,Qt,Qabstractitemmodel,Qstandarditemmodel,Qstandarditem,我正在用QS标准模型写一些包装。是否可以跟踪QStandardItems的生存期(删除事件) 我认为唯一的方法是将QObject+QStandardItem相互关联。但出于某些原因,我不想这么做 更新: 当此项从模型中删除时,我需要删除包含QStandardItem指针的对象 这是解决办法。但是我想对外部(不是我的)QStandardItem做同样的事情 class ItemWrap : public QObject, public QStandardItem { // ... }; cla

我正在用QS标准模型写一些包装。是否可以跟踪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 );
  }
  // ...
};

你能澄清一下你所说的轨道寿命是什么意思吗。 为什么要子类化
QObject
? 您是否要使用
信号
插槽
?如果没有,那么我认为它没有多大用处。
除此之外,您还可以使用构造函数和析构函数或合适的函数对
QStandardItem
进行子类化,并跟踪生命周期?

每个数据模型都有关于模型更改的信号,请参阅的文档,这是您需要的


请注意,
QStandardItem
不是一个
QObject
,因此它没有任何信号或插槽。

就像Qt中经常出现的情况一样,有些对象不是QObject,而是由QObject管理的(或者通过QObject访问)。您需要使
MyObject
监视项目所在的模型。下面的代码可能是一个起点

另一种尚未实现但确实可行的方法是,使用您自己创建的实例副本动态替换模型中的所有项。通过监视相关模型信号,可以通知您所有项目的添加,并将项目替换为您所在工厂的实例。这将是对
QStandardItemModel
的一种轻描淡写的依赖注入

开销最低的方法是将信号和插槽从单个对象移动到模型本身,这样可以避免潜在的大量QoObject的开销,同时仍然保留它们的信号/插槽功能

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());
  }
};
类MyObject:公共QObject{
Q_对象
QStandardItem*m_项目;
Q_RowsAboutToBeRemoved上的插槽无效(常量QModelIndex和父项,整数开始,整数结束){
如果(m_项->父项()==父项&&
m_item->index().row()>=开始&&
m_item->index().row()父项()==父项&&
m_item->index().column()>=开始&&

m_item->index().column()更新了问题。顺便说一句,我在最初的问题中说过,我不想同时使用
QObject
和QStandardItem。理想情况下,我想要一个解决方案,而不使用
QStandardItem
(特别是子类化)。谢谢,这已被接受。还应跟踪重置模型,该模型非常重-约为O(n^2)。因此,我们决定从QObject中插入QStandarItem。@DmitrySazonov我不知道模型重置将如何,除了O(n),因为您要做的就是删除n个对象。我认为您根本不应该使用QObject项。您应该修改一个模型,为您提供相关的信号或插槽,这些信号或插槽是单个模型对象应该有的。我还希望您不要重新实现
QDataWidgetMapper
:)我有一个类列表
MyItemWrapper
。类包含
QStandardItem*m\u item;
字段。摘要N个类。另外,我有一个包含K个项的模型。在模型库上,我需要测试
MyItemWrapper
的每个实例在模型中的存在性。所以复杂性是O(N*K)~O(N^2).我说得对吗?备注:我正在创建一个模型,它可以从内部项生成QMenu。我用我的想法创建了额外的问题-