如何将 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。之后我可以将它传递给另一个班级。从那里我应该能够从中提取文本(questionTextquestionExplanation)。

【问题讨论】:

你不能半途而废地改变你的问题。否则,您会使所有引用问题原始实例的答案无效。 我应该开始一个新线程吗?我所做的只是在声明我的 qvector 后将 int 改为 Question 现在有什么问题? Append 似乎不存在于向量中,因为我声明它是一个问题向量。我的一位朋友告诉我使用 QList。我回家的时候试试。你有什么建议吗? 您能否发布整个代码(在问题中)以及您使用QVector 的部分和预期结果? 【参考方案1】:

您正在尝试将 Question 类类型的对象推入 QVector&lt;int&gt;,这显然是在期待 int。您应该先将其更改为 QVector&lt;Question&gt;

不过,我强烈建议您在进一步了解 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 与多个对象一起使用的主要内容,如果未能解决你的问题,请参考以下文章

QVector 与具有参数的自定义对象?

有没有办法将 QVariant 与 QVector 一起使用?

Qt - 如何将 QVector<QString> 保存并加载到多个标签中?

如何将 QVector3D 与 QMatrix3x3 相乘?

如何实例化并附加到指向我的对象的指针的 QVector

QList和QVector等容器的区别