将新的QStringList分配给我的QStringListModel的私有QStringList

时间:2014-06-25 12:09:19

标签: c++ qt oop model-view-controller

抱歉这个菜鸟问题。我浏览了文档并创建了自己的QStringListModel。我需要做的是将QStringList的所有条目分配为我的模型的条目(因此将我的模型的私有成员设置为等于新的QStringList)。

我根据文档完全创建了模型,所以我不会在这里列出它。我声明我在hpp文件中使用的模型如下:

QAbstractItemModel *oldFilesModel;

即使我像这样在cpp中创建它:

oldFilesModel = new FileListModel(emptyStringList);

现在,我在我的派生类(FileListModel - 派生自QStringListModel)中添加了一个新的公共函数,如下所示:

in hpp:

void setStringList(QStringList newList);

在cpp:

void FileListModel::setStringList(QStringList newList)
{
    this->removeRows(0,this->rowCount());
    fileNames = newList;
}

这应该设置我的私有QStringList,名为fileNames等于QStringList newList正确吗? (不确定这是否是正确的方法,因此非常感谢任何其他建议。)

我的问题是我无法在我的cpp文件中调用此函数,因为我的模型是QAbstractItemModel类型。如果我的对象被定义为基类的类型,我如何从我的子类访问此函数?

2 个答案:

答案 0 :(得分:2)

目前尚不清楚为什么要首先将oldFilesModel声明为QAbstractItemModel - 为什么不将其声明为QStringListModel?这将立即消除您问题的至少一个方面。

但更大的问题是,您似乎将自己的QStringList数据成员添加到FileListModel - 但如果它来自QStringListModel,那么它已经具有此功能,以及settergetter函数。

所以解决这个问题需要一点点改写。具体而言,FileListModel中不需要您自己的这些功能版本,或者fileNames - QStringListModel的创建正是为了免除您自己编写这些功能的麻烦。但回到第一个问题 - 如果你必须演员,那么这样做:

qobject_cast<QStringListModel*>(oldFilesModel)->setStringList(newList);

答案 1 :(得分:1)

我认为你的方法至少存在一个缺陷:你隐藏基类&#39;函数QStringListModel::setStringList(const QStringList &)与自定义类中的另一个函数。如果基类中的函数声明为virtual,但它不是,那就没问题。你需要做的是,只有另一个函数,比如调用基类函数的setMyStringList。例如:

void FileListModel::setMyStringList(QStringList newList)
{
    removeRows(0, this->rowCount());
    setStringList(newList); // Calls the base class function.
}

我认为没有理由在课堂上保留fileNames。您始终可以使用QStringListModel::stringList()函数获取字符串列表。