我正在尝试子类QStandardItemModel
以确保每当QStandardItem
移除此QStandardItemModel
时,该项目的数据也会被删除,这是在动态分配的内存中。以下是一个例子:
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*>();
但他们不适合我。我很感激任何帮助。