如何将 QVector 与多个对象一起使用
Posted
技术标签:
【中文标题】如何将 QVector 与多个对象一起使用【英文标题】:How to use the QVector with multiple object 【发布时间】:2014-02-02 13:21:32 【问题描述】:我正在尝试使用Qt
中的QVector
类来工作(对我来说:P)。我想要做的是将对象Question
的多个实例放在QVector
中。
我参加了多个论坛,但对于我来说,它们都太复杂了,因为我是初学者。 这是one post was perfect,但我没有找到解决问题的方法。
所以我求助于你!
这是我想要工作的功能:
创建包/向量的部分
/**
* @brief MenuQuestionnary::assembleQuiz
* Assemble the bundle of question that will be used in Quiz class
*/
void MenuQuestionnary::assembleQuiz()
QVector<Question> vectorQuiz;
vectorQuiz.reserve(spinBoxNumberOfQuestion->value());
for(int i = 0; i <= spinBoxNumberOfQuestion->value(); i++)
vectorQuiz.append(Question((qrand()% maximumNumberOfQuestionAvailable)));
这是我的问题构造函数:
Question::Question(int id)
this->questionId = id;
//TODO: Actually get it from DB
this->questionText = "2+2?";
this->explanation = "Addition mechanics";
this->creatorId = 1;
我希望在这里做的是将Question
对象的选定编号放入vector
。之后我可以将它传递给另一个班级。从那里我应该能够从中提取文本(questionText
和 questionExplanation
)。
【问题讨论】:
你不能半途而废地改变你的问题。否则,您会使所有引用问题原始实例的答案无效。 我应该开始一个新线程吗?我所做的只是在声明我的 qvector 后将 int 改为 Question 现在有什么问题? Append 似乎不存在于向量中,因为我声明它是一个问题向量。我的一位朋友告诉我使用 QList。我回家的时候试试。你有什么建议吗? 您能否发布整个代码(在问题中)以及您使用QVector
的部分和预期结果?
【参考方案1】:
您正在尝试将 Question
类类型的对象推入 QVector<int>
,这显然是在期待 int
。您应该先将其更改为 QVector<Question>
。
不过,我强烈建议您在进一步了解 C++ 之前先阅读 a good book,否则您对它的体验会变得越来越复杂。
从互联网上的论坛复制粘贴代码不是编程,很快就会给您带来麻烦。
【讨论】:
我在这里发帖时看到了错误。我通过用对象名称替换 int 来编辑我的问题。另外我没有复制粘贴代码,我尝试了那个cageman向我提出的建议,玩了一下,但我无法解决它。 +1 表示“从互联网上的论坛复制粘贴代码不是编程”:P 这就是我要求解释的原因。否则,我会尝试人们对我的建议,并尝试自己找到解释。我读过几本关于 c++ 的书,我有一个特定的问题,我需要帮助。【参考方案2】:我想你想要的是这个:QVector vectorQuiz; vectorQuiz.reserve(spinBoxNumberOfQuestion->value()); // 在向量中为性能保留正确的空间量(不是必需的)。我不知道你将如何使用vectorQuiz,但也许你应该使用指向问题的指针,即QVector并使用new Question()插入问题
/**
* @brief MenuQuestionnary::assembleQuiz
* Assemble the bundle of question that will be used in Quiz class
*/
void MenuQuestionnary::assembleQuiz()
int iVectorSize = spinBoxNumberOfQuestion->value();
QVector<Question> vectorQuiz;
vectorQuiz.reserve(iVectorSize );
for(int i = 0; i <= iVectorSize ; ++i)
vectorQuiz.append(Question(i));
【讨论】:
你的代码给了我这个错误:没有匹配的函数来调用'Question::Question()'并且错误位于 qvector.h...另外它说 qVector 没有有一个名为 append 的函数......看起来它注定要失败:P 好像你没有为 Question 定义一个构造函数。我假设它是一个类? 班级问题已定义。通常它可以工作,但当我尝试将其放入向量中时却不行......【参考方案3】:您的对象 (vectorQuiz) 声明为整数向量。如果你想给它添加一些整数值,你应该写一些东西:
vectorQuiz.append( someIntegerValue );
或
vectorQuiz.push_back( someIntegerValue );
对于另一种类型的向量(即问题),编写如下代码:
QVector<Question> vectorQuiz;
// ...
for(int i = 0; i <= spinBoxNumberOfQuestion->value(); ++i)
vectorQuiz.append(Question(i)); // without [i] after vector object
您可能应该在 for-cycle 中使用严格的不等式 而不是 (但我不确定)。
【讨论】:
我想把 Question 的对象放进去。然后我会编辑我的问题。【参考方案4】:我通过尝试几件事解决了它 这是我所做的解释
我已将我的职能一分为二。第一个将元素放在QList
中,第二个将其随机播放。
/**
* @brief MenuQuestionnary::assembleQuiz
* @param list
* Asseble a quiz in the Qlist and then ask shuffle to shuffle it...
*/
void MenuQuestionnary::assembleQuiz(QList<Question> &list)
for(int i = 0; i < spinBoxNumberOfQuestion->value(); ++i)
int rand = qrand() * maximumNumberOfQuestionAvailable;
Question newQuestion(rand);
list.append(newQuestion);
shuffleQuiz(list);
/**
* Method Shuffle
* equivalent to shuffling a deck of cards: we take a random one, move it to be the last one,
* then do it again enough times to have statistically touched every card.
*/
void MenuQuestionnary::shuffleQuiz(QList<Question> &list)
int iters = list.size() * list.size();
for (int i = 0; i < iters; ++i)
int rand = qrand() * list.size();
list.append(list[rand]);
list.removeAt(rand);
感谢您的帮助。
【讨论】:
以上是关于如何将 QVector 与多个对象一起使用的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法将 QVariant 与 QVector 一起使用?
Qt - 如何将 QVector<QString> 保存并加载到多个标签中?