Russian Qt Forum
Ноябрь 26, 2024, 16:52 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2 3   Вниз
  Печать  
Автор Тема: Таймер с обратным отсчетом  (Прочитано 21477 раз)
QPeter
Гость
« : Февраль 28, 2014, 02:02 »

Возникла необходимость создать таймер, по истечении времени которого будут происходить некоторые действия. Пытался создать глобальную переменную, и присвоить ей значение вводимое в TimeEdit,  и чтоб по нажатию кнопки время начинало уменьшаться в  другом поле TimeEdit(если будет легче сделать чтоб вместо timeEdit был другой элемент отображения, то можно заменить). Ну и собственно когда таймер будет на 00:00 сделать некоторые действия. Могу представить алгоритм всего этого, он собственно совсем не сложный, а с реализацией туго как то..(

Код:
class Widget : public QWidget
{
...
    QTimer t1;//создание глобальной переменной
Код:
 QObject::connect(ui->timeEdit, SIGNAL(timeChanged(QTime)), t1, SLOT(setTime(QTime)));//неправильное присвоение значения.)
    QObject::connect(ui->pbStart, SIGNAL(clicked()), this, SLOT(Timer()));
Код:
void Widget::Timer()
{
   do{
        t1->addSecs(-100);//уменьшение значения таймера
    }while(t1==0);

    ui->tabWidget_2->setCurrentIndex(2);//какие то действия
  }

С учётом моей неспособности точно излагать свои мысли покажу всё наглядно:
1)
2)
Записан
OKTA
Гость
« Ответ #1 : Февраль 28, 2014, 07:25 »

Читаем документацию на QTimer:

Код:
Example for a one second (1000 millisecond) timer (from the Analog Clock example):
     QTimer *timer = new QTimer(this);
     connect(timer, SIGNAL(timeout()), this, SLOT(update()));
     timer->start(1000);
From then on, the update() slot is called every second.


interval : int
This property holds the timeout interval in milliseconds.
The default value for this property is 0. A QTimer with a timeout interval of 0 will time out as soon as all the events in the window system's event queue have been processed.
Setting the interval of an active timer changes its timerId().
Access functions:
int interval () const
void setInterval ( int msec )
Записан
QPeter
Гость
« Ответ #2 : Март 01, 2014, 17:52 »

А объявлять переменную нужно в заголовочном файле или в исходнике? Просто мне же нужно будет использовать переменную потом в других функциях, поэтому наверное следовало бы объявить ей глобально в заголовочном файле, но тогда как к ней привязать этот connect?
 И как правильно присвоить значение то которое вводится в timeEdit к переменной?
Код:
 
QTimer* t3=new QTimer(this);
connect(t3, SIGNAL(timeout()), this, SLOT(update()));
t3->start(1000);


QObject::connect(ui->timeEdit, SIGNAL(timeChanged(QTime)), t3, SLOT(setTime(QTime)));
- так???
Записан
QPeter
Гость
« Ответ #3 : Март 02, 2014, 23:41 »

 Плачущий Плачущий Плачущий

Помогите сделать таймер с обратным отсчётом с использованием timeEdit..(
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #4 : Март 03, 2014, 00:41 »

давай составим алгоритм действий, а ты его сам реализуешь.

- слот нажатия кнопки: считать введенное время (на твоей картинке это №1) и поместить его в оставшееся время (№3); запустить таймер, срабатывающий каждую секунду (1000 мс).
- слот срабатывания таймера: считать время из оставшегося (№3), отнять от него 1 с (1000 мс), записать полученный результат в оставшееся время (№3); если результат равен нулю, остановить таймер.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
QPeter
Гость
« Ответ #5 : Март 03, 2014, 01:49 »

Алгоритм я себе давно представить смог, даже рисовал, с реализацией проблемы и работой  с timeEdit.
Цитировать
- слот нажатия кнопки: считать введенное время (на твоей картинке это №1) и поместить его в оставшееся время (№3);
Код:
QObject::connect(ui->timeEdit_2, SIGNAL(timeChanged(QTime)), ui->timeEdit, SLOT(setTime(QTime)));
Цитировать
запустить таймер, срабатывающий каждую секунду (1000 мс).
Код:
    
    QTimer* countdown=new QTimer(this);//время в верхнем углу
    connect(countdown, SIGNAL(timeout()),this,SLOT(update_time_down()));
    countdown->start(1000);
И тут уже возникает вопрос, мне же нужна глобальная переменная, получается её нужно в заголовочном файле объявлять. И тогда как, где connect правильно прописывать? Или надо вообще ещё одну переменную создать Qtime и к ней значения присваивать потом?

Цитировать
- слот срабатывания таймера: считать время из оставшегося (№3), отнять от него 1 с (1000 мс), записать полученный результат в оставшееся время (№3); если результат равен нулю, остановить таймер.
Код:
void Widget::update_time_down()
{
[u]//считать время из оставшегося (№3)- как это сделать?[/u]
countdown.addSecs(-1000);//предполагаю что это тоже не самая правильная реализация, тк значение наверное должно чему то присваиваться или оно и так сработает??
[u]записать полученный результат в оставшееся время (№3);- так же как и с присвоением переменной значения в timeEdit, как это сделать?[/u]
if(countdown==0)
{
     connect(countdown, SIGNAL(timeout()),this,SLOT(stop()));//вроде это делается как то так
}
}
« Последнее редактирование: Март 03, 2014, 01:51 от QPeter » Записан
OKTA
Гость
« Ответ #6 : Март 03, 2014, 09:50 »

Вы о какой переменной?  Непонимающий
Записан
QPeter
Гость
« Ответ #7 : Март 03, 2014, 12:51 »

к которой нужно присваивать значение из timeEdit.
Записан
OKTA
Гость
« Ответ #8 : Март 03, 2014, 12:55 »

Можно и переменную, но тяжко советовать что-либо, пока неизвестно, как там у тебя внутри все устроено)
Записан
QPeter
Гость
« Ответ #9 : Март 03, 2014, 12:57 »

Всё устроено примитивно)

https://drive.google.com/file/d/0B_y-nG4qALcOREdIakhfc2J1TmM/edit?usp=sharing  - собран в qt 5.2.1
https://drive.google.com/file/d/0B_y-nG4qALcOQl9Xc3U4SldkN2s/edit?usp=sharing - собран в 4.8
« Последнее редактирование: Март 03, 2014, 13:12 от QPeter » Записан
QPeter
Гость
« Ответ #10 : Март 03, 2014, 13:11 »

А кстати как пере собрать проект, который был создан в qt 4.8, в qt 5.2? А то кучу ошибок выдает.
Записан
OKTA
Гость
« Ответ #11 : Март 03, 2014, 13:14 »

Если все так, то читайте время прямо из гуи, когда надо.
А чтобы пересобрать, надо взять и почитать что-нибудь типа http://qt-project.org/wiki/Transition_from_Qt_4.x_to_Qt5
Записан
QPeter
Гость
« Ответ #12 : Март 03, 2014, 13:20 »

Цитировать
Если все так, то читайте время прямо из гуи, когда надо
-как, как  это сделать???

Ооо спасибо)
...а на русском нету? А то Google Translate не совсем идеально переводит)
 Строит глазки Строит глазки
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #13 : Март 03, 2014, 13:32 »

переменную таймера сделать полем класса, таймер создай и законнекть в конструкторе, в слотах только вызывай ему старт/стоп (это просто вызов соответствующего метода). все остальное решается чтением документации (нахождением нужных методов), это я за тебя делать не буду.

время читается не из таймера, а из таймэдита.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
QPeter
Гость
« Ответ #14 : Март 03, 2014, 13:41 »

Так  а вы мне можете сказать как переменной присвоить значение из timeEdit ? как то так?
Код:
 QTimer* countdown=new QTimer(this);//время в верхнем углу
    connect(countdown, SIGNAL(timeout()),this,SLOT(update_time_down()));
    countdown->start(1000);
connect(ui->timeEdit, SIGNAL(timeChange(QTime)), countdown, SLOT(setTime(QTime)))
Записан
Страниц: [1] 2 3   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.298 секунд. Запросов: 23.