带有 QVariant 和模板的变量返回类型



我正在尝试对QStandardItemModel进行子类化,以确保每当删除此QStandardItemModelQStandardItem时,该项目的数据也会被删除,这些数据位于动态分配的内存中。下面是一个示例:

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 文件中具有模板实现。将实现移动到头文件。您可以查看此答案以获取更详细的解释。

最新更新