2017-01-16 14 views
1

Я делаю таймер/секундомер с Qt Creator. Но моя функция сброса (кнопка сброса нажата) не работает так, как я этого хочу. Я хочу, чтобы он остановил таймер и установил отображение (QLCDNumber) на 0. Вместо этого таймер остановлен, но номера дисплея остаются такими же, как если бы была нажата кнопка паузы. За исключением того, что когда таймер запускается (кнопка запуска нажата) снова, он перезапускается с исходного времени (как я этого хочу). Вот код.Qt QLCDNumber issue

Я включил только части, которые являются частью проблемы.

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

Советы для публикации: (а) мы не используем [разрешено] в заголовке здесь; (b) последующие решения ниже, а не как изменения; (c) если вы решите свою исходную проблему, но имеете новый вопрос, тогда не изменяйте вопрос, если это изменение очень мало и у вас пока нет ответов. – halfer

+0

Кроме того, я вижу, что вы редактировали какой-то код в своем вопросе, когда вы его решили. Если это была проблема, пожалуйста, отмените ее, чтобы ваш вопрос был точным представлением проблемы. На этом сайте нет смысла поддерживать ответ без лишних вопросов. – halfer

+0

@halfer Извините! Будет делать, как вы говорите. – cppxor2arr

ответ

0

Ваш щелчок на кнопке обрабатывается только в задержке функции(), содержащей processEvents(). Когда выполняется 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 См. Отредактированный пост. –

+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.