首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >轨道QStandardItem寿命

轨道QStandardItem寿命
EN

Stack Overflow用户
提问于 2014-02-28 16:33:03
回答 3查看 408关注 0票数 1

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

我认为唯一的方法是互打QObject + QStandardItem。但出于某些原因我不想这么做。

更新:

当此项目从模型中移除时,我需要删除包含指向QStandardItem的指针的对象。

这是解决办法。但是我也想对外部的(不是我的) QStandardItem做同样的事情。

代码语言:javascript
复制
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 );
  }
  // ...
};
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-02-28 18:36:34

与Qt中通常的情况一样,有些对象不是QObjects,而是由QObject管理的(或者通过QObject进行其他访问)。您需要让MyObject监视项目所在的模型。下面的代码可能是一个起点。

另一种方法没有实现,但确实可行,就是用您自己创建的实例动态地替换模型中的所有项。通过监视相关的模型信号,可以将所有项的添加通知给您,并将项目替换为工厂的实例。这将是在QStandardItemModel中隐藏的依赖项注入。

开销最低的方法是将信号和时隙从单个对象移动到模型本身,这样您就可以避免可能有很多QObjects的开销,同时仍然保留它们的信号/时隙功能。

代码语言:javascript
复制
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());
  }
};
票数 1
EN

Stack Overflow用户

发布于 2014-02-28 17:25:08

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

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

票数 1
EN

Stack Overflow用户

发布于 2014-02-28 16:38:30

请您澄清您的意思,轨道的一生。为什么要子类QObject?你打算使用SIGNALSSLOTs吗?如果没有,那么我不认为它会有多大用处。除此之外,您还可以使用QStandardItem子类并使用跟踪生命周期,您的构造函数和析构函数或合适的函数?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22100654

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档