Мне нужна помощь в использовании Qtimer.
Я работаю с Qt 5.0.2 и вот моя проблема:
Я пытаюсь разработать таймер, и интерфейс прост:
Есть всего 2 кнопки: кнопка «Старт», чтобы запустить таймер, и кнопка «Пауза», и QtimeEdit для отображения времени.
На этом скриншоте показано, как это выглядит: http://img834.imageshack.us/img834/1046/5ks6.png
Проблема в том, что функция паузы не работает. Я прочитал всю документацию о Qtimer здесь: http://harmattan-dev.nokia.com/docs/library/html/qt4/qtimer.html и здесь: qt.developpez.com/doc/5.0-snapshot/qtimer/, но безрезультатно.
Это исходный код, который у меня есть: (я помещаю только то, что нужно)
// Creation of the Buttons and the time area
void MainWindow::createBottom()
{
bottom = new QWidget();
play = new QPushButton("Launch",this);
pause = new QPushButton("Pause",this);
play->setDisabled(false);
pause->setDisabled(true);
timeEdit = new QTimeEdit(this);
timeEdit->setDisplayFormat("mm:ss");
layout->addWidget(play);
layout->addWidget(pause);
layout->addWidget(timeEdit );
bottom->setLayout(layout);
connect(play, SIGNAL(clicked()), this, SLOT(startSimulation()));
connect(pause, SIGNAL(clicked()), this, SLOT(pauseSimulation()));
}
// to resume the timer where is was stopped
void MainWindow::resumeSimulation()
{
timer->blockSignals( false );
pause->setText("Pause");
pause->disconnect(SIGNAL(clicked()));
connect(pause, SIGNAL(clicked()), this, SLOT(pauseSimulation()));
paused = false;
timer->start();
int timeOfPause = time->restart();
int timeTotal = timeOfPause + timeElapsed;
time->addMSecs(-timeTotal);
}
// to Start the timer
void MainWindow::pauseSimulation()
{
timer->blockSignals(true);
pause->setText("Resume");
timer->stop();
play->setDisabled(false);
//pause->setDisabled(true);
pause->disconnect(SIGNAL(clicked()));
connect(pause, SIGNAL(clicked()), this, SLOT(resumeSimulation()));
paused = true;
}
// to Start the timer from zero.
void MainWindow::startSimulation()
{
timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this , SLOT(updateTime()));
timer->start(500);
play->setDisabled(true);
pause->setDisabled(false);
}
void MainWindow::updateTime()
{
if(time == NULL)
{
time = new QTime(0,0,0,0);
time->start();
}
//timeEdit->setTime(QTime::fromS(time->elapsed()));
//time = &(time->addMSecs(1000));
if(hasRestart)
{
time->restart();
time->addMSecs(-timeElapsed);
hasRestart = false;
}
else
{
timeElapsed =+ time->elapsed();
}
int seconds = 0;
int minutes = 0;
int hours = 0;
if(!paused)
{
seconds = (timeElapsed/1000)%60;
minutes = (timeElapsed/60000)%60;
hours = (timeElapsed/3600000)%24;
std::cout << "Test : " << hours << ":" << minutes << ":" << seconds << std::endl;
timeEdit->setTime(QTime(0,minutes,seconds,0));
timeEdit->update();
}
}
Когда я нажимаю кнопку «Пуск», таймер запускается хорошо, но когда я нажимаю «Пауза», он только приостанавливает его в графическом интерфейсе, но когда я возобновляю, он показывает текущее время, как если бы он не останавливался.
Например :
Я начал. Я делаю паузу в 00:05. Он блокирует видимо таймер. Жду 10 секунд. Я возобновляю таймер, он показывает 00:15 вместо 00:06
Как я мог это исправить?
Спасибо !
РЕДАКТИРОВАТЬ: Спасибо, Куба Обер, но не могли бы вы объяснить мне код, который вы разместили, пожалуйста?
Как работает пауза?
QTimer
каждый раз, когда запускаете симуляцию? ОткудаtimeElapsed
получает свое значение? - person thuga   schedule 26.08.2013updateTime()
, который вы не показали. - person Marek R   schedule 26.08.2013time->addMSecs(-timeTotal);
ничего не делает. QTime::addMSecsReturns a QTime object containing a time ms milliseconds later than the time of this object (or earlier if ms is negative).
Значит должно бытьtime = time->addMsecs(-timeTotal);
- person thuga   schedule 26.08.2013