2017-01-16 22 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()が実行されると、アプリケーションにメッセージが送信されますが、の後にが実行され、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に代わって投稿)
+0

QTimerはどのように使用しますか? – cppxor2arr

+0

@ 6EQUJ5編集済みの記事を参照してください。 –

+0

私は概念を参照してください。私はすべてを廃止することなくこれを実装できると思います。どうもありがとう! – cppxor2arr

0

すべてが解決されました!私は偶然、ストップウォッチのディスプレイをリセットしていました。ありがとう@マイケル!

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)は機能しません。 QLCDNumberは0にリセットされません。