我正在尝试对QStandardItemModel
进行子类化,以确保每当删除此QStandardItemModel
的QStandardItem
时,该项目的数据也会被删除,这些数据位于动态分配的内存中。下面是一个示例:
Q_DECLARE_METATYPE(MyType*)
MyType* myData = new MyType;
QStandardItem* myItem = new QStandardItem;
QVariant var;
var.setValue(myData);
myItem->setData(var);
现在,当我从物料模型中删除myItem
时,我想确保myData
也被删除。所以我从QStandardItemModel
继承如下:
// header file
#include <QStandardItemModel>
#include <QStandardItem>
#include <QTreeView>
#include <QVariant>
#include <QModelIndex>
class TreeViewItemModel: public QStandardItemModel {
public:
TreeViewItemModel(QTreeView* parent = 0) {}
template <typename T> void delete_dynamic_item(QStandardItem* item,
int role = Qt::DisplayRole);
virtual ~TreeViewItemModel() {}
private:
Q_OBJECT
};
// source file
#include "tree_view_item_model.h"
template <typename T>
void TreeViewItemModel::delete_dynamic_item(QStandardItem* item,
int role) {
int row = item->row();
QModelIndex parentIndex = this->indexFromItem(item->parent());
QVariant itemVariant = item->data(role);
T itemData = itemVariant.value<T>();
delete itemData;
this->removeRow(row, parentIndex);
}
仅当我不在程序中调用TreeViewItemModel::delete_dynamic_item()
时,才会编译。如果我这样做,我会收到一个链接器错误LNK2019
。我搜索了网络并尝试了建议的事情,例如:
T itemData = (T) itemVariant.value<void*>();
但他们对我不起作用。我将不胜感激对此的任何帮助。
我认为问题是您在.cpp文件中而不是头 .h 文件中具有模板实现。将实现移动到头文件。您可以查看此答案以获取更详细的解释。