Обновление текста локального QLabel по мере изменения данных в C ++ - PullRequest
0 голосов
/ 20 февраля 2019

У меня есть следующий код, который инициализирует метку в соответствии с идентификатором объекта.

for (int i = 0; i < inputVal; ++i)
{
     QLabel *newLabel = new QLabel(p0[i]->id, page);
     connect(p0, &Npc::setID, [&] 
          { newLabel->text() = p0[i]->id; });
     layout->addWidget(newLabel);
}

Я пытаюсь использовать вышеуказанный connect для обновления значения метки каждый раз, когда я меняюзначение идентификатора объекта.Тем не менее, это не работает из-за того, что ярлык выходит из области видимости и его значение становится недоступным.Есть ли способ получить доступ к значению метки, не объявляя его вне этой области?

Это также зависит от слота, выполняемого после функции сигнала, что, я бы предположил, имеет место.Если это не так, есть ли другой способ обновить динамические метки при изменении значений объекта?

1 Ответ

0 голосов
/ 20 февраля 2019

Вы можете изменить свой код следующим образом:

for (int i = 0; i < inputVal; ++i)
{
    auto *obj = p0[i];
    QLabel *newLabel = new QLabel(obj->id, page);
    connect(obj, &Npc::setID, [obj, newLabel] 
        { newLabel->setText(obj->id); });
    layout->addWidget(newLabel);
}

Объяснение: даже если указатель newLabel действительно выходит из области видимости после завершения итерации цикла, фактическийQLabel он указывает на нет - он создается в куче, поэтому он не будет удален, пока что-то не удалит его - в вашем случае макет позаботится об этом.Таким образом, вы можете захватить newLabel указатель по значению (адрес, на который он указывает, будет просто скопирован в лямбду), а также указатель на ваш объект.Вам также необходимо использовать правильный setText метод установки QLabel, чтобы назначить ему новый текст;text Метод является геттером, он возвращает копию текста, хранящегося в метке, а не ссылку на него.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...