【问题标题】:BeagleBoard x15 shows only the last counter number? QtBeagleBoard x15 只显示最后一个计数器编号? Qt
【发布时间】:2017-12-06 04:05:34
【问题描述】:

我使用 BeagleBoard x15 来显示计数器。当我点击一个按钮时,它会运行一个循环:

for(int i=0;i<10;i++){
    ui->label->setText(QString::number(i));
    delay(1s);
}

但它只显示最后一个数字:标签上的“9”。它应该在每 1 秒后显示:1、2、3、4、5、...9。我使用 Qt。

你能告诉我发生了什么吗?谢谢。

【问题讨论】:

    标签: c++ qt qt5 beagleboard


    【解决方案1】:

    问题是因为Qt的应用程序存在于你的延迟阻塞的循环中,正确的做法是使用QTimer

    ui->label->setText("0");
    QTimer *timer(this);
    connect(timer, &QTimer::timeout, [timer, this](){
        int i = ui->label->text().toInt();
        ui->label->setText(QString::number(i+1));
        if(i == 9)
            timer->stop();
    });
    
    timer->start(1000);
    

    【讨论】:

    • 其实我知道QTimer可以用,但是我不想用。我解决了这个问题:使用 qApp->processEvents.
    • @Colo 不建议这样做,因为可能会阻止其他进程,也许您当前的程序可以工作,但处理更多事件的程序无法正常工作。
    • 我会再次检查我的代码。感谢您的帮助。
    • @Colo 从您的 cmets 判断,我认为您没有得到它。在事件驱动的环境中,您永远不会在 GUI 线程中使用 delay()。标签最后只显示 9 的直接原因是小部件是异步重绘的,而您的应用程序无法在 9 秒内执行此操作。此外,应用程序在 9 秒内没有响应任何内容 - 包括用户输入。您通过在每次循环迭代中强制处理事件队列来修复它的糟糕想法有助于隐藏问题,并且应用程序只会每秒响应一堆事件。
    • QEventLoop 还有一个实现可以和定时器一起使用,有时间我会发布一个新的解决方案
    猜你喜欢
    • 1970-01-01
    • 2016-06-14
    • 1970-01-01
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多