Qt QLCDNumber issue



我正在用Qt Creator制作计时器/秒表。但是,我的重置功能(单击重置按钮)没有按我想要的方式工作。我希望它停止计时器并将显示(QLCDNumber)设置为0。相反,计时器将停止,但显示数字与单击暂停按钮时保持不变。除了当计时器再次启动(单击开始按钮)时,它会从原始时间重新启动(正如我希望的那样)。这是代码。

我只包括了作为问题一部分的部分。

void MainWindow::delay()
{
    QTime dieTime = QTime::currentTime().addSecs(1);
    while (QTime::currentTime() < dieTime && !spause && !sreset)
    {
        QCoreApplication::processEvents(QEventLoop::AllEvents, 100);
        std::this_thread::sleep_for(std::chrono::milliseconds(1));
    }
}
void MainWindow::on_tstart_clicked()
{
    ttime = treset ? 0 : ttime;
    tpause = treset = false;
    ttime = ttime == 0 ? (ui->hr->value() * 3600 + ui->min->value() * 60 + ui->sec->value()) : ttime;
    while (ttime >= 0 && !tpause && !treset)
    {
        const unsigned short sec = ttime % 3600 % 60, min = ttime % 3600 / 60, hr = ttime / 3600;
        ui->tsec2->display(sec % 10);
        ui->tsec1->display(sec / 10);
        ui->tmin2->display(min % 10);
        ui->tmin1->display(min / 10);
        ui->thr2->display(hr % 10);
        ui->thr1->display(hr / 10);
        delay();
        if (!tpause && !treset) --ttime;
    }
}
void MainWindow::on_tpause_clicked()
{
    tpause = true;
}
void MainWindow::on_treset_clicked()
{
    treset = true;
    ui->ssec2->display(0);
    ui->ssec1->display(0);
    ui->smin2->display(0);
    ui->smin1->display(0);
    ui->shr2->display(0);
    ui->shr1->display(0);
}

您单击按钮仅在包含 processEvents() 的函数 delay() 中处理。执行delay()时,它会向应用程序发送消息,但在启动下一个循环on_treset_clicked() while()执行。使用QTimer来避免这种情况。

以下是在您的情况下使用 QTimer 的方法。

(mainwindow.h)
#include <QTimer>
...
QTimer timer;
(mainwindow.cpp)
MainWindow::MainWindow()
{
    ...
    connect(&timer,SIGNAL(timeout()),this,SLOT(on_timer()));
}
void MainWindow::on_tstart_clicked()
{
    timer.start(1000);
}

void MainWindow::on_timer()
{
    if(timer.isActive()) return;
    ttime--;
    (display LCD values)
    if(ttime<=0) 
    {
        ttime=0;
        (emit signal for alarm or whatever you want)
        timer.stop();
    }
}
void MainWindow::on_tpause_clicked()
{
    timer.stop();
    (display LCD values)
}
void MainWindow::on_treset_clicked()
{
    timer.stop();
    ttime=0;
    (display zeroes)
}

(代表OP发布)。

一切都解决了!我不小心重置了秒表显示。谢谢@Michael!

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    // ttimer was declared in "MainWindow" -> QTimer ttimer;
    connect(&ttimer, SIGNAL(timeout()), this, SLOT(on_timer()));
}
void MainWindow::on_tstart_clicked()
{
    ttime = ttime == 0 ? (ui->hr->value() * 3600 + ui->min->value() * 60 + ui->sec->value()) : ttime;
    ttimer.start(1000);
}
void MainWindow::on_timer()
{
    if (!ttimer.isActive()) return;
    --ttime;
    const unsigned short hr = ttime / 3600, min = ttime % 3600 / 60, sec = ttime % 60;
    ui->tsec2->display(sec % 10);
    ui->tsec1->display(sec / 10);
    ui->tmin2->display(min % 10);
    ui->tmin1->display(min / 10);
    ui->thr2->display(hr % 10);
    ui->thr1->display(hr / 10);
    if (ttime <= 0)
    {
        // (emit signal for alarm or whatever you want)
        ttimer.stop();
    }
}
void MainWindow::on_tpause_clicked()
{
    ttimer.stop();
    // (display LCD values)
}
void MainWindow::on_treset_clicked()
{
    ttimer.stop();
    ttime = 0;
    ui->tsec2->display(0);
    ui->tsec1->display(0);
    ui->tmin2->display(0);
    ui->tmin1->display(0);
    ui->thr2->display(0);
    ui->thr1->display(0);
}

我在代码中实现了 QTimer,但是当我按下"开始"按钮 (on_tstart_clicked) 或任何其他按钮时,没有任何反应(显示没有变化)。

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    // ttimer was declared in "MainWindow" -> QTimer ttimer;
    connect(&ttimer, SIGNAL(timeout()), this, SLOT(on_timer()));
}
void MainWindow::on_tstart_clicked()
{
    ttime = ttime == 0 ? (ui->hr->value() * 3600 + ui->min->value() * 60 + ui->sec->value()) : ttime;
    ttimer.start(1000);
}
void MainWindow::on_timer()
{
    if (!ttimer.isActive()) return;
    --ttime;
    const unsigned short hr = ttime / 3600, min = ttime % 3600 / 60, sec = ttime % 60;
    ui->tsec2->display(sec % 10);
    ui->tsec1->display(sec / 10);
    ui->tmin2->display(min % 10);
    ui->tmin1->display(min / 10);
    ui->thr2->display(hr % 10);
    ui->thr1->display(hr / 10);
    if (ttime <= 0)
    {
        // (emit signal for alarm or whatever you want)
        ttimer.stop();
    }
}
void MainWindow::on_tpause_clicked()
{
    ttimer.stop();
    // (display LCD values)
}
void MainWindow::on_treset_clicked()
{
    ttimer.stop();
    ttime = 0;
    ui->ssec2>tsec2->display(0);
    ui->ssec1>tsec1->display(0);
    ui->smin2>tmin2->display(0);
    ui->smin1>tmin1->display(0);
    ui->shr2>thr2->display(0);
    ui->shr1>thr1->display(0);
}

这个问题很简单,但我一直在掩盖它。我不得不将ttimer.isActive()更改为!ttimer.isActive()。

但是,现在重置(on_treset_clicked)不起作用。QLCDNumber 不会重置为 0。

相关内容

  • 没有找到相关文章