我写了一个小型的工作演示来说明我的问题。
我有一个复杂的模型,它包含两个子模型(存储在QList中)。我的视图可以根据用户想要看到的内容显示第一个子模型或第二个子模型。出于这个原因,我需要跟踪当前/活动/显示的子模型,并且我需要能够在需要显示时导航到另一个模型(因此需要跟踪那个模型)。 / p>
我可以通过下面的代码中的指针存储当前的子模型,但在我看来,切换当前的子模型可能会变得复杂 - 特别是如果我需要添加另一个子模型。
现在在我看来,迭代器可能是跟踪当前子模型的最佳方式,next()
,hasNext()
同样prev()
和hasPrev()
将是无缝的从UI调用,但我应该使用迭代器,因为我在列表中只有两个项目(QList)?
以下是代码(请原谅公众成员,我想简单地说明我的问题)
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
MyModel model;
// prints current selected model name for sake of simplicity
model.m_currentModel->print(); // output is "No1"
return a.exec();
}
class MyModel : public QStandardItemModel
{
Q_OBJECT
public:
MyModel()
{
subModels.append( m_currentModel = new SubModel("No1") );
subModels.append( new SubModel("No2") );
}
QList< SubModel*> subModels;
SubModel * m_currentModel;
};
class SubModel : public QStandardItemModel
{
Q_OBJECT
public:
SubModel(QString name);
QString m_name;
void print()
{
qDebug() << m_name;
}
};
请记住(如果重要的话)在我的真实项目中,选择子模型的时间更长,并且用户执行的所有操作都应用于该模型。我的应用程序将始终只有这两个子模型。
现在我应该使用iterator
或pointer
子模型跟踪当前的子模型吗?
其他背景信息: 我的应用程序有点像汽车装配线(但只有两辆车)。第一辆车上线(现在是现在的汽车),应用程序将其配置为高级包装。比第二辆车进来现在是现在的车,并配置为基本车。但是用户可以通过选择它作为当前(=活动)汽车返回并查看以前汽车的配置。
答案 0 :(得分:1)
您至少有三个选择:
指针 - 存储指向当前正在使用的项目的指针。这是重量轻,效率高,但更难使用,因为你没有概念或“下一步”或“上一步”等......
迭代器 - 迭代器被设计用于STL(或Q-STL)并且是甾体的指针...所以你可以用它们做更多的事情,我会说它是一个更好的选择而不是花费你更多的资源。
一个简单的索引,例如int activeCarId
。这对于列表,向量等非常简单但非常有效...因为您可以++
或--
,您唯一需要注意的是列表限制,您可以随时查看比如if (activeCarId < list.size()) ...
在这个例子中,我会通过使用简单的索引来跟踪。对于你来说,交换规则很简单,你可以这样做:
if (++activeCarId >= list.size())
activeCarId = 0;
如果activeCarId为0,那么它将变为1.如果activeCarId为1,它将变为2,但由于2是&gt; = list.size(),它将被设置为0.。
我相信还有其他选择:)