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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как остановить таймер?  (Прочитано 7258 раз)
useruser
Гость
« : Октябрь 04, 2013, 14:01 »

Код:
void MainWindow::onButtonClick1()
{
QTimer* timer=new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(onTimeout()) );

if(ui->pushButton->text()=="Старт")
{
timer->start(1000);
ui->pushButton->setText("Стоп");
}
else
{
timer->stop();
ui->pushButton->setText("Старт");

}

}

Таймер не останавливается, весь код в onTimeout() выполняется каждую секунду.
Записан
_OLEGator_
Гость
« Ответ #1 : Октябрь 04, 2013, 14:05 »

Прежде чем переходить к Qt надо изучить C++!
Что создается в этой строке и какова область видимости переменной?
Код
C++ (Qt)
QTimer* timer=new QTimer(this);
Записан
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4350



Просмотр профиля
« Ответ #2 : Октябрь 04, 2013, 14:06 »

Таймер не останавливается, весь код в onTimeout() выполняется каждую секунду.
Вы на каждое нажатие создаете новый таймер, а слот onTimeout продолжают вызывать старые таймеры.
Записан
useruser
Гость
« Ответ #3 : Октябрь 04, 2013, 14:19 »

Old - вы правы. Буду "копать" в этом направлении.
Записан
useruser
Гость
« Ответ #4 : Октябрь 04, 2013, 17:29 »

Написал так
Код:
void MainWindow::onButtonClick1()
{

if(ui->pushButton->text()=="Старт")
{
QTimer* timer=new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(onTimeout()) );
timer->start(1000);
ui->pushButton->setText("Стоп");
}
else
{
//timer->stop();
ui->pushButton->setText("Старт");

}
}

И новая проблема - область видимости. Теперь timer->stop(); вне этой области, что немного странно т.к. if условный оператор.
« Последнее редактирование: Октябрь 04, 2013, 17:46 от useruser » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #5 : Октябрь 04, 2013, 17:52 »

чтоб не повторяться про «учи С++», отвечу просто: сделай таймер полем класса.
Записан

Изучением 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
useruser
Гость
« Ответ #6 : Октябрь 04, 2013, 18:41 »

Код:
class myclass {
public:
//Функция
void MainWindow::onButtonClick1()
{
if(ui->pushButton->text()=="Старт")
{
QTimer* timer=new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(onTimeout()) );
timer->start(1000);
ui->pushButton->setText("Стоп");
}
else
{
//timer->stop();
ui->pushButton->setText("Старт");
}}

};

Выдаёт ошибку. Не хочет быть функция MainWindow::onButtonClick1() методом класса myclass.
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #7 : Октябрь 04, 2013, 21:46 »

Цитировать
Выдаёт ошибку. Не хочет быть функция MainWindow::onButtonClick1() методом класса myclass.
Потому что эта функция (метод) уже является частью класса. Только вне классов так описываем принадлежность методов.

Учите с++ Улыбающийся


Код:
h.
Код:
class MainWindow: public QMainWindow
{
  Q_OBJECT

// какой-то код...

public:
      MainWindow(QWidget *parent = 0); // конструктор класса    

// какой-то код...

private:
      QTimer* timer; // указываем в поле класса указатель на таймер

// какой-то код...
};

cpp.
Код:
MainWindow::MainWindow(QWidget *parent /*= 0*/) : 
    QMainWindow(parent)
{
// какой-то код...

     timer = new QTimer(this); // выделяем память под таймер
     connect(timer, SIGNAL(timeout()), this, SLOT(onTimeout()));

// какой-то код...
}

void MainWindow::onButtonClick1()
{
    if(ui->pushButton->text()=="Старт")
    {
      timer->start(1000);
      ui->pushButton->setText("Стоп");
    }else
     {
        timer->stop();
        ui->pushButton->setText("Старт");
     }
}
« Последнее редактирование: Октябрь 04, 2013, 21:48 от gil9red » Записан

lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #8 : Октябрь 05, 2013, 11:26 »

Написал так
Код:
void MainWindow::onButtonClick1()
{

if(ui->pushButton->text()=="Старт")
{
QTimer* timer=new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(onTimeout()) );
timer->start(1000);
ui->pushButton->setText("Стоп");
}
else
{
//timer->stop();
ui->pushButton->setText("Старт");

}
}

И новая проблема - область видимости. Теперь timer->stop(); вне этой области, что немного странно т.к. if условный оператор.
ну и что что if условный оператор?
Область видимости переменной ограничена фигурными скобками, т.е.
Код
C++ (Qt)
{
   QTimer* timer=new QTimer(this);
   connect(timer, SIGNAL(timeout()), this, SLOT(onTimeout()) );
   timer->start(1000);
   ui->pushButton->setText("Стоп");
}
всё что объявлено в пределах этих фигурных скобок, видно только в пределах этих фигурных скобок.
Мало того, если переменная объявлена на стеке (без оператора new), то и жить она будет только в пределах своей области видимости. Как только управление перейдёт за пределы этого блока с фигурными скобками, такая переменная прекратит своё существование.
Записан

Юра.
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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