【问题标题】:Qt QLCDNumber issueQt QLCDNumber 问题
【发布时间】:2017-05-31 07:18:34
【问题描述】:

我正在使用 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);
}

【问题讨论】:

  • 发帖的专业提示:(a)我们这里的标题中不使用[已解决]; (b) 在下面发布解决方案,而不是作为编辑; (c) 如果您解决了最初的问题但有新问题,则不要修改问题,除非更改非常小并且您还没有任何答案。
  • 另外,我看到您在解决问题时编辑了一些代码。如果那是问题,那么请撤消它,以便您的问题是问题的准确表示。这个网站没有必要毫无疑问地保持答案。
  • @halfer 对不起!照你说的做。

标签: c++ qt timer qtimer qlcdnumber


【解决方案1】:

您对按钮的单击仅在包含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)
}

【讨论】:

  • 我将如何使用 QTimer?
  • 我明白了这个概念。我想我可以实现这一点,而不必废弃所有东西。非常感谢!
【解决方案2】:

(代表 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);
}

【讨论】:

    【解决方案3】:

    我在代码中实现了 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。

    【讨论】:

      猜你喜欢
      • 2013-01-24
      • 1970-01-01
      • 1970-01-01
      • 2011-01-24
      • 2011-09-20
      • 1970-01-01
      • 1970-01-01
      • 2020-05-01
      相关资源
      最近更新 更多