2017-01-16 10 views
1

Ich mache einen Timer/Stoppuhr mit Qt Creator. Aber meine Reset-Funktion (Reset-Taste geklickt) funktioniert nicht so, wie ich es möchte. Ich möchte, dass es den Timer stoppt und die Anzeige (QLCDNumber) auf 0 setzt. Stattdessen wird der Timer gestoppt, aber die Display-Nummern bleiben gleich, als ob die Pause-Taste geklickt wurde. Nur wenn der Timer erneut gestartet wird (Startknopf geklickt), startet er von der ursprünglichen Zeit (wie ich es möchte) neu. Hier ist der Code.Qt QLCDummer Problem

Ich nur die Teile, die Teil des Problems sind.

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

Pro-Tipps zum Posten: (a) wir verwenden [gelöst] nicht im Titel hier; (b) post-Lösungen unten, anstatt als Bearbeitungen; (c) Wenn Sie Ihr ursprüngliches Problem lösen, aber eine neue Frage haben, dann ändern Sie die Frage nicht, es sei denn, die Änderung ist sehr klein und Sie haben noch keine Antworten. – halfer

+0

Außerdem sehe ich, dass Sie in Ihrer Frage einen Code bearbeitet haben, als Sie ihn gelöst haben. Wenn das das Problem war, dann bitte rückgängig machen, so dass Ihre Frage eine genaue Darstellung des Problems ist. Es hat keinen Sinn auf dieser Seite eine Antwort ohne Frage zu halten. – halfer

+0

@halfer Sorry! Wird tun, was du sagst. – cppxor2arr

Antwort

0

Ihr Klick auf eine Schaltfläche nur in der Funktion Verzögerung(), die processEvents() verarbeitet wird. Wenn delay() ausgeführt wird, sendet es eine Nachricht an die Anwendung, aber on_treset_clicked() wird ausgeführt, nachdem die nächste Schleife von while() gestartet wurde. Verwenden Sie QTimer, um diese Situation zu vermeiden.

Hier ist wie Sie QTimer in Ihrem Fall verwenden.

(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

Wie würde ich QTimer dafür verwenden? – cppxor2arr

+0

@ 6EQUJ5 Siehe den bearbeiteten Post. –

+0

Ich sehe das Konzept. Ich denke, ich kann das umsetzen, ohne alles verschrotten zu müssen. Danke vielmals! – cppxor2arr

0

(Geschrieben im Auftrag des OP).

Alles ist gelöst! Ich habe die Stoppuhranzeige versehentlich zurückgesetzt. Danke @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

I umgesetzt QTimer in meinem Code, aber wenn ich die Schaltfläche "Start" (on_tstart_clicked) oder andere Tasten drücken, passiert nichts (keine Änderung der Anzeige).

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

Das Problem war einfach, aber ich beschönigte es immer wieder. Ich musste timer.isActive() zu! Ttimer.isActive() ändern.

Aber jetzt funktioniert das Zurücksetzen (on_treset_clicked) nicht. Die QLCDennummern werden nicht auf 0 zurückgesetzt.