QT - 我可以使用传递给方法的变量动态指向GUI的标签吗?

时间:2015-03-30 23:17:19

标签: c++ qt

我正在创建广告资源,并希望使用传入我方法的项目名称来引用我的库存表单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 ...

1 个答案:

答案 0 :(得分:0)

我想我会按照你的要求去做。我会使用findChildfindChildren访问它。

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
}

希望有所帮助。