就像 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());
}
};