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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Работа с таймером  (Прочитано 7483 раз)
BigHom
Гость
« : Апрель 15, 2011, 11:30 »

Как правильно сделать , чтобы таймер стартовал при нажатии одной кнопки. А остановка таймера производидась при нажатии другой кнопки?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Апрель 15, 2011, 11:34 »

Код
C++ (Qt)
int timerId = 0;
.................
timerId = startTimer (100);
......................
if (timerId) {
 killTimer (timerId);
 timerId = 0;
}
 
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
BigHom
Гость
« Ответ #2 : Апрель 15, 2011, 12:03 »

Qt4.4.3 что делаю не так ?
1)пытаюсь организовать таймер в prog.cpp

void prog::on_pushButton_clicked()
{
   QTimer *timer1 = new QTimer(this);
   connect(timer1, SIGNAL(timeout()), this, SLOT(uptimer1()));
   timer1->start(ntime);

}
void prog::uptimer1()
{
timer1->stop();
}

при трансляции выдаётся сообщение ,что в uptimer1 не объявлен timer1

2) при другом  способе работы с таймером:
 в prog.h

    QTimer timer1;

private slots:
   void on_pushButton_clicked();
   void uptimer1();

Как сделать , чтобы при срабатывании таймера вызывалась uptimer1?
Записан
mutineer
Гость
« Ответ #3 : Апрель 15, 2011, 12:05 »

1) Переменная timer1 живет локально в on_pushButton_clicked(), ее нет в других функциях

2) также через connect связать таймер со слотом
« Последнее редактирование: Апрель 15, 2011, 12:11 от mutineer » Записан
NicK
Гость
« Ответ #4 : Апрель 15, 2011, 12:12 »

Вариант объявить указатель на таймер в заголовочном файле (например, в private) не подходит?  Улыбающийся
Записан
BigHom
Гость
« Ответ #5 : Апрель 15, 2011, 12:19 »

1) Переменная timer1 живет локально в on_pushButton_clicked(), ее нет в других функциях

2) также через connect связать таймер со слотом
1) понятно что только в on_pushButton_clicked(),  а как сделать чтобы жила и в другой функции - как правильно организовать?
2) в каком месте и как конкретно через connect связать таймер со слотом ?
Записан
BigHom
Гость
« Ответ #6 : Апрель 15, 2011, 12:21 »

Код
C++ (Qt)
int timerId = 0;
.................
timerId = startTimer (100);
......................
if (timerId) {
 killTimer (timerId);
 timerId = 0;
}
 

Как к данному таймеру подключить функцию обработки таймера , в которой будет использоваться killTimer (timerId) ?
Записан
mutineer
Гость
« Ответ #7 : Апрель 15, 2011, 12:24 »

1) Переменная timer1 живет локально в on_pushButton_clicked(), ее нет в других функциях

2) также через connect связать таймер со слотом
1) понятно что только в on_pushButton_clicked(),  а как сделать чтобы жила и в другой функции - как правильно организовать?
2) в каком месте и как конкретно через connect связать таймер со слотом ?


1) Сделай указатель на таймер членом класса, создание таймера и связывание со слотом перенеси в конструктор класса

2) В конструкторе, точно так же, как и сейчас, только с учетом что это уже не указатель. Но лучше второй вариант отбрось и делай по первому
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #8 : Апрель 15, 2011, 12:32 »

Код
C++ (Qt)
int timerId = 0;
.................
timerId = startTimer (100);
......................
if (timerId) {
 killTimer (timerId);
 timerId = 0;
}
 

Как к данному таймеру подключить функцию обработки таймера , в которой будет использоваться killTimer (timerId) ?
Если класс наследуется от QObject, то переопредели у него timeEvent.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
BigHom
Гость
« Ответ #9 : Апрель 15, 2011, 14:26 »

Если класс наследуется от QObject, то переопредели у него timeEvent.

Добавил в файл prog.h :

 protected:
    void timerEvent(QTimerEvent *);

в файл prog.cpp :

void berbas::timerEvent(QTimerEvent *)
{
uptimer1(); // обработка по срабатыванию таймера
}

вроде , всё работает - следует ли в свою void berbas::timerEvent(QTimerEvent *) делать вызов от оригинала и если да - то что именно дописать ?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #10 : Апрель 15, 2011, 14:30 »

Чего?
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
BigHom
Гость
« Ответ #11 : Апрель 15, 2011, 14:51 »

Чего?
чтобы всё было корректно ,чтобы все функции(в смысле действия) предка выполнялись  , но тут вроде всё работает - только  когда будет не один таймер - а обработчик один...
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #12 : Апрель 15, 2011, 14:55 »

Все пучком. Ничего больше не нужно.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
mutineer
Гость
« Ответ #13 : Апрель 15, 2011, 14:56 »

Чего?
чтобы всё было корректно ,чтобы все функции(в смысле действия) предка выполнялись  , но тут вроде всё работает - только  когда будет не один таймер - а обработчик один...

QTimerEvent *      -   из этого параметра можно вытащить id таймера, который вызвал обработчик
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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