抱歉这个菜鸟问题。我浏览了文档并创建了自己的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类型。如果我的对象被定义为基类的类型,我如何从我的子类访问此函数?
答案 0 :(得分:2)
目前尚不清楚为什么要首先将oldFilesModel
声明为QAbstractItemModel
- 为什么不将其声明为QStringListModel
?这将立即消除您问题的至少一个方面。
但更大的问题是,您似乎将自己的QStringList
数据成员添加到FileListModel
- 但如果它来自QStringListModel
,那么它已经具有此功能,以及setter和getter函数。
所以解决这个问题需要一点点改写。具体而言,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()
函数获取字符串列表。