Я делаю таймер / секундомер с 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);
}
Ваше нажатие на кнопку обрабатывается только в функции delay (), содержащей 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)
}
(Опубликовано от имени ОП).
Все решаемо! Я сбрасывал дисплей секундомера случайно. Спасибо, Михаил!
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);
}
Я реализовал 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.