2017-01-16 128 views
1

我正在用Qt Creator製作計時器/秒錶。但是,我的重置功能(重置按鈕被點擊)沒有按照我的要求工作。我希望它停止計時器並將顯示器(QLCDNumber)設置爲0.相反,計時器停止,但顯示數字保持不變,就像單擊暫停按鈕一樣。除了當定時器再次啓動(點擊開始按鈕)時,它會從原始時間重新開始(正如我希望的那樣)。這是代碼。Qt QLCDNumber問題

我只包含了問題的一部分。

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); 
} 
+0

發佈的專業提示:(a)我們不在這裏使用[解決]的標題; (b)在下面發佈解決方案,而不是編輯; (c)如果你解決了你的原始問題,但有一個新的問題,那麼不要修改這個問題,除非這個改變非常小,你還沒有任何答案。 – halfer

+0

另外,當你解決問題時,我看到你在你的問題中編輯了一些代碼。如果那是問題,那麼請撤消它,以便您的問題能夠準確地表達問題。在這個網站沒有任何問題沒有問題的答案。 – halfer

+0

@halfer對不起!會按你說的去做。 – cppxor2arr

回答

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) 
} 
+0

我該如何使用QTimer? – cppxor2arr

+0

@ 6EQUJ5查看編輯的文章。 – 2017-01-16 14:43:45

+0

我看到了這個概念。我想我可以實現這一點,而不必取消所有內容。非常感謝! – cppxor2arr

0

(發佈代表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); 
} 
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)不起作用。 QLCDN號碼不會重置爲0.