我有一个应用程序,我正在制作一个类的项目,其中包含游戏刽子手和其他人
我有一个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];
}
}
}
答案 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