1

我正在为 QStandardItemModel 编写一些包装器。是否可以跟踪 QStandardItems 的生命周期(删除事件)?

我认为唯一的方法是interhit 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 );
  }
  // ...
};
4

3 回答 3

1

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

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

于 2014-02-28T17:25:08.777 回答
1

就像 Qt 中经常出现的情况一样,有些对象不是 QObject,而是由 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());
  }
};
于 2014-02-28T18:36:34.163 回答
0

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

于 2014-02-28T16:38:30.670 回答