随着C 的数据更改,更新本地Qlabel的文本



我有以下代码,该代码初始化标签以匹配对象的ID。

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来刷新标签的值,任何时候我更改对象ID的值。但是,由于标签超出范围及其价值变得无法访问,因此这无效。有什么方法可以访问标签的值而不在此范围之外声明它?

这也呈现在信号函数后执行的插槽上,我认为情况就是这样。如果不是这样,随着对象值的变化,是否有其他方法更新动态标签?

您可以如下更改代码:

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指针(所指向的地址仅复制到lambda中)以及指向对象的指针。您还需要使用QLabel的正确setText设置器方法为其分配新文本; text方法是一个getter,它返回了存储在标签中的文本的副本,而不是对其的引用。

最新更新