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

时间:2017-03-20 20:42:42

标签: c++ qt templates

我正在尝试子类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*>();

但他们不适合我。我很感激任何帮助。

1 个答案:

答案 0 :(得分:0)

我认为问题在于你在.cpp文件而不是标题.h文件中有模板实现。将实现移动到头文件。您可以查看this answer以获取更详细的说明。