如何创建一组能够遍历

时间:2017-02-15 22:49:57

标签: c++ qt

我有一个应用程序,我正在制作一个类的项目,其中包含游戏刽子手和其他人 我有一个Line Edit输入字段供用户猜字母。此输入限制为1个字母。
 我想要一个for循环来检查用户输入是否匹配游戏目标词中的任何字母,如果是,它会将该字母放在屏幕上。
我有一堆标签,我计划在其中放入一个字母,每个标签都与正确的字符串中的字母位置相对应。
如何将qt ui元素放入数据结构中,以便我可以在for循环中访问它们?
以下是我在线查看后尝试的一些代码,以便让您了解我尝试做的事情。

int Hangman::check_input(QString input){

    QList<QObject *> visible_word = {ui->label_0, ui->label_1,ui->label_2, ui->label_3,ui->label_4};
    int i;
    for (i = 0; i < current_word.length(); i++){
        if (input == current_word[i]){
            ui->visible_word[i]->text() == current_word[i];
        }
    }
}

2 个答案:

答案 0 :(得分:2)

你做了什么,并假设英语,因为可能的字母数量可能固定在26(除非你因某些原因允许非字母字符),所以真的没什么错了。如果标签的数量可变或很大,那么它只会出现问题,而且这种情况似乎都不是这样。

您还可以使用findChildren方法,并且有几种变体。最简单的方法是,如果所有标签都是同一个小部件的父级,并且同一个父级下没有其他QLabel个实例:

QList <QLabel *> parent->findChildren <QLabel *> ();

否则,您可能需要使用接受正则表达式的变体来匹配子名称:

QList <QLabel *> parent->findChildren <QLabel *> (QRegExp ("^label_"));

请注意,两种情况下的顺序可能都不是您想要用所选字母填充标签的顺序。文档没有说,但我相信返回的顺序反映了子项的创建顺序。由于您在Qt Designer中创建它们,该顺序可能不可靠;例如,如果您错过了中间的第12个并将其添加到其他中,那么label_12将在列表中排在最后。根据您的其他方法,这可能或不重要。如果您需要列表的顺序为标签0,标签1等,那么您当前的机制可能就是您想要的。

这似乎是蛮力,而且有时,这是完全可以接受的。

答案 1 :(得分:1)

从您拥有的代码开始,让我们修复它,使其具有正确的方法签名,并编译:

printf()

但是手动枚举这些Ui元素并不是手动将它们插入到Ui文件的布局中也没什么意义。相反,将Ui文件保留为空布局,并根据需要以编程方式插入元素。首先,让我们近似来自最小/// Returns the number of newly matched letters. int Hangman0::check_input(QChar input) { int matched{}; std::array<QLabel*, 5> visible_word = {ui->label_0, ui->label_1,ui->label_2, ui->label_3,ui->label_4}; for (int i{}; i < current_word.length(); i++) { auto const ch = current_word.at(i); if (input == ch && visible_word[i]->text() != ch) { visible_word[i]->setText(ch); ++ matched; } } return matched; } 文件的uic输出:

.ui

然后,让我们设计一个基本的// https://github.com/KubaO/stackoverflown/tree/master/questions/hangman-42261596 #include <QtWidgets> #include <forward_list> namespace Ui { // Approximate uic output struct Hangman { QFormLayout * topLayout; QHBoxLayout * lettersLayout; QLineEdit * letterEntry; QPushButton * setup; void setupUi(QWidget * widget) { topLayout = new QFormLayout{widget}; topLayout->addRow(lettersLayout = new QHBoxLayout); topLayout->addRow("Guess", letterEntry = new QLineEdit); letterEntry->setMaxLength(1); topLayout->addRow(setup = new QPushButton{"Setup"}); } }; } 游戏小部件。我们可以在Hangman中按值保留字母标签 - 这使得生活相对容易,我们不必处理任何类型的显式内存管理。

std::forward_list