我有以下代码,该代码初始化标签以匹配对象的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,它返回了存储在标签中的文本的副本,而不是对其的引用。