在一段时间内更改标签文本

Change label text for some duration

本文关键字:标签 文本 一段时间      更新时间:2023-10-16

我的标签中有一些文本,现在我想更改该文本 1 分钟,然后返回到旧文本。

在我的构造函数中,我做到了:

ui->lbl->setText("Original text");
timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(atTime()));
timer->setInterval(1000);
timer->setSingleShot(false);
timer->start();

在我的atTime((函数中:

...
text="Different text";
QTimer::singleShot(60000, this, SLOT(changeText()));
...

changeText((函数:

void MainWindow::changeText()
{
ui->lbl->setText(text);
}

使用此代码,我可以在特定时间更改文本,但它保持不变。如何使该文本存在 1 分钟,然后再次更改为原始文本?

您可以使用这样的简单函数:

void change(QLabel * label, const QString & text, int ms_keep = 60000, int ms_after = 0)
{
QString originaltext = label->text();
QTimer::singleShot(ms_after, [=](){
label->setText(text);
QTimer::singleShot(ms_keep, [=](){
label->setText(originaltext);
});
});
}

在以下示例中,临时文本将在五秒后设置,原始文本将在十秒后恢复。

ui->lbl->setText("original text");
change(ui->lbl, "temporary text", 10000, 5000);

如果要立即设置临时文本,请省略最后一个参数(默认为零(:

change(ui->lbl, "temporary text", 10000);

显然,您已经触发了计时器更改为新文本,但是您没有将文本值恢复为原始文本,因此即使计时器超时将再次触发,在60000ms之后,文本仍保留在"不同文本"上。 简而言之,您需要每次更改文本值,执行超时函数,在您的情况下更改文本函数。例如,一些基本解决方案,您可以进一步改进:

void MainWindow::changeText()
{
if (text == newValue) // lets say newValue = "Different text"
text = oldValue;  // lets say oldValue = "Original text"
else
text = newValue;
ui->lbl->setText(text);
}