c++ - 如何从 QtObjects(lineedit,combobox) 获取?
问题描述
我使用 for(int i=0; i< Number;i++=) 算法生成了 QWidget QTGui 对象。因此,当我更改 Widget 上的某些内容时,我无法获取所有 Qtgui 对象信息。它只给出最后一个“i”值参数。我需要在一个 QString 中获取 i=0 的所有参数。在 i=1 之后获取所有参数。
像这样:
i=0 1.Runner distance ,percentage = %80 Place = ComboBoxValue
i=1 1.Runner distance ,percentage = %60 Place = ComboBoxValue
当我更改组合框或百分比值时。最后,我想取百分比和组合框的值。像这样:
QString Runner1= QString(_Numberlabel->text() + label->text() + lineEdit->text() + comboBox->currentText()); QString Runner2= QString(_Numberlabel->text() + label->text() + lineEdit->text() + comboBox->currentText());
enter code here
for(int i=0; i < runnerList.size() ;i++)
{
Layout = new QHBoxLayout();
Layout->setSpacing(6);
_Numberlabel= new QLabel();
_Numberlabel->setObjectName(QString::fromUtf8("_Numberlabel"));
_Numberlabel->setText(QString("First Runner").arg(i+1).arg(runnerList[i][0]).arg(runnerList[i][1]));
QFont font;
font.setFamily(QString::fromUtf8("Calibri"));
font.setPointSize(10);
font.setBold(true);
font.setWeight(75);
_Numberlabel->setFont(font);
Layout->addWidget(_Numberlabel);
label = new QLabel();
label->setObjectName(QString::fromUtf8("label"));
label->setMaximumSize(QSize(60, 16777215));
label->setFont(font);
label->setText("Percantage:");
Layout->addWidget(label);
lineEdit = new QLineEdit();
lineEdit->setObjectName(QString::fromUtf8("lineEdit"));
lineEdit->setMaximumSize(QSize(50, 16777215));
lineEdit->setText("%");
Layout->addWidget(lineEdit);
comboBox = new QComboBox();
comboBox->setObjectName(QString::fromUtf8("comboBox"));
comboBox->setMinimumSize(QSize(0, 25));
comboBox->setMaximumSize(QSize(90, 16777215));
comboBox->addItem("1");
comboBox->addItem("2");
comboBox->addItem("3");
comboBox->addItem("4");
Layout->addWidget(comboBox);
this->ui.verticalLayout->addLayout(Layout);
}
解决方案
您要么需要保留您创建的对象的句柄:
// definition:
QList<QLineEdit*> lineEdits;
QList<QComboBox*> combos;
这些列表应该是类成员。
// usage:
for(int i=0; i < runnerList.size() ;i++)
{
//...
lineEdits << lineEdit;
combos << comboBox;
}
然后,您可以稍后获取这些值:
... = QString(lineEdits[i]->text() + combos[i]->currentText());
或者您可以通过它们唯一的对象名称找到它们:
ui.verticalLayout->findChild<QLineEdit*>(QString("lineEdit_%1").arg(i))->text();
// I didn't try to compile this code!
为此,您需要给每个QLineEdit
/QComboBox
一个唯一的对象名称。
或者您搜索所有QLineEdit
s 并希望它们的顺序是明确定义的:
ui.verticalLayout->findChildren<QLineEdit*>("lineEdit")[i]->text();
免责声明:这一切都非常丑陋,但你应该能够看到它是如何工作的。
无论您的选择如何,请注意:
你的线
_Numberlabel->setText(QString("First Runner").arg(i+1).arg(runnerList[i][0]).arg(runnerList[i][1]));
包含错误,因为您的QString(...)
不包含占位符%1
, %2
, ...,但后面是.arg()
调用。除了在控制台上创建警告之外,这不会做任何事情。
推荐阅读
- mysql - 用于比较表中两个值的简单内连接
- django - 为什么 django 解析注释 HTML 代码中的标签?
- javascript - 如何自动输入凭据到 javascript 弹出窗口?我试过“webdriver wait”但我得到“TimedOutException”
- jenkins - 我如何使用詹金斯中的构建参数和使用可变参数来触发另一个作业
- material-design - 焦点后材料设计输入文本字段标签位置不正确
- rebus - Rebus Azure 主题名称清理
- asp.net - 在点击事件上过滤数据源
- java - 获取子文档中的数据
- python - 如何在 Django 的 MVT 中正确实现 AJAX
- c# - 自定义属性使用基类值作为参数