给QStringListModel的私有QStringList赋值一个新的QStringList

Assigning a new QStringList to the private QStringList of my QStringListModel

本文关键字:QStringList 一个 赋值 QStringListModel      更新时间:2023-10-16

不好意思,这个问题很幼稚。我浏览了文档并创建了自己的QStringListModel。我需要做的是将QStringList的所有条目分配给我的模型的条目(从而将我的模型的私有成员设置为新的QStringList)。

我几乎完全按照文档创建了模型,所以我不会在这里列出它。我像这样声明我在hpp文件中使用的模型:

QAbstractItemModel *oldFilesModel;

尽管我在cpp中这样创建了它:

oldFilesModel = new FileListModel(emptyStringList);
现在,我已经在我的派生类(FileListModel -它派生自QStringListModel)中添加了一个新的公共函数,如下所示: 在高压泵

:

void setStringList(QStringList newList);
在cpp:

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

这应该设置我的私人QStringList称为文件名等于QStringList newList正确吗?(不确定这是否是正确的方法,所以任何其他建议将不胜感激)。

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

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

但更大的问题是,你似乎是添加自己的QStringList数据成员FileListModel -但如果它是从QStringListModel派生的,那么它已经有这个,随着setter和getter函数。

所以要算出来需要稍微重写一下。具体来说,在FileListModelfileNames中不需要您自己版本的这些函数——创建QStringListModel正是为了省去您自己编写这些函数的麻烦。但回到第一个问题——如果你必须强制转换,那么这样做:

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

我认为你的方法中至少有一个缺陷:你在自定义类中隐藏了基类的函数QStringListModel::setStringList(const QStringList &)。如果基类中的函数声明为虚函数,这是可以的,但它不是。你要做的,就是有另一个函数,比如setMyStringList,它会调用基类函数。例如:

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

我看不出有什么理由让fileNames留在你的课上。您总是可以使用QStringListModel::stringList()函数获得字符串列表。