我正在创建广告资源,并希望使用传入我方法的项目名称来引用我的库存表单QLabel。
QLabel和项目的名称是相同的,所以我想通过引用QLabel来减少if语句,具体取决于传入的项目的名称。
void Zork::on_btnTake_clicked()
{
Item *item = new Item(ui->takeItem->currentText().toStdString());
Colin->addItemToInventory(item);
inventory_screen->addItem(item->getDescription()); //Enables the Item in the Inventory
currentRoom->deleteItem(item);
ui->takeItem->removeItem(ui->takeItem->currentIndex()); //Only remove the item in the foreground of combobox at the time take button was clicked
}
调用此方法addItemToInventory(item):
void Inventory_Ui:: addItem(string itemName){
myUi->itemName->setText(QString::fromStdString(itemName));
}
我无法这样做,因为itemName不是Ui的成员,尽管itemName确实包含Ui的成员。
示例:
在我的Inventory_Ui表单中,我有6个标签,一个名为broken_bottle。我想将broken_bottle传递给方法的参数itemName,并将它们用作参考,因此在运行时它看起来像myUi->broken_bottle->setText
...
答案 0 :(得分:0)
我想我会按照你的要求去做。我会使用findChild
或findChildren
访问它。
http://doc.qt.io/qt-5/qobject.html#findChild
http://doc.qt.io/qt-5/qobject.html#findChildren
QList <QLabel *> labels = ui->myForm()->findChildren<QLabel*>();
QLabel* targetLabel = 0;
foreach(QLabel * label, labels)
{
if(label->text() == ui->takeItem->currentText())
{
targetLabel = label;
break;
}
}
if(targetLabel != 0)
{
// ... do something with targetLabel
}
...或
QList <QLabel *> labels = ui->myForm()->findChildren<QLabel*>();
foreach(QLabel * label, labels)
label->setObjectName(label->text());
// later
QLabel * targetLabel = ui->myForm()->findChild<QLabel*>("text of label");
if(targetLabel)
// use it
或者如果您将所有这些标签连接到同一个插槽,您可以使用发送方静态方法来解决其中的一些问题。
http://doc.qt.io/qt-5/qobject.html#sender
void MainWindow::on_takeItem_currentTextChanged()
{
QLabel* targetLabel = qobject_cast<QLabel*>QObject::sender();
if(targetLabel)
// do something with it
}
希望有所帮助。