как остановить Qtimer по условию

когда я выполняю этот Qtimer, он говорит «недопустимое использование« этого »в функции, не являющейся членом»

QTimer *timerStart( )
{
QTimer* timer = new QTimer(  );
Ball *b = new Ball();

QObject::connect(timer,SIGNAL(timeout()),b,SLOT(move()));
//timer->start( timeMillisecond );
timer->start(15);
return timer;
}

мой файл ball.h

class Ball: public QObject, public QGraphicsRectItem{
Q_OBJECT
public:
// constructors
Ball(QGraphicsItem* parent=NULL);

// public methods
double getCenterX();




public slots:
// public slots
void move();



private:
// private attributes
double xVelocity;
double yVelocity;
int counter = 0;
QTimer timerStart( );



// private methods
void stop();
void resetState();
void reverseVelocityIfOutOfBounds();
void handlePaddleCollision();
void handleBlockCollision();
};

#endif // BALL_H

функция move() находится в том же классе. то, что я хочу сделать, это остановить возвращаемый таймер при выполнении условия if.

когда я выдаю этот код в конструкторе Ball::Ball в Cpp, он отлично работает. мяч движется.

  QTimer* timer = new QTimer();
  timer->setInterval(4000);

  connect(timer,SIGNAL(timeout()),this,SLOT(move()));

  timer->start(15);

но когда я добавляю Qtimer *timerStart за конструктор Ball::Ball, iT не работает


person Alex D Rex    schedule 22.11.2017    source источник
comment
Я думаю, что вам не хватает области действия в вашем классе. QTimer * YourClass::timerStart(..), добавьте эту функцию в свой файл класса h.   -  person Simon    schedule 22.11.2017
comment
сэр, я пытался, но это дает мне ошибку,   -  person Alex D Rex    schedule 22.11.2017
comment
пожалуйста, поделитесь дополнительным кодом, чтобы я мог вам помочь.   -  person Simon    schedule 22.11.2017
comment
сэр, я обновил код.   -  person Alex D Rex    schedule 22.11.2017
comment
timer виден только внутри конструктора. Если вы хотите получить к нему доступ в другом месте, объявите его как член класса.   -  person scopchanov    schedule 22.11.2017
comment
Сэр, это очень поможет, если вы можете привести пример, как объявить его как член класса, чтобы вернуть таймер.   -  person Alex D Rex    schedule 22.11.2017


Ответы (1)


Объявите QTimer как члена вашего класса

ч файл:

class Ball: public QObject, public QGraphicsRectItem{
{
  Q_OBJECT

  public:
    // constructor
    Ball(QGraphicsItem* parent=Q_NULLPTR);
    // control your timer
    void start();
    void stop();
    ...
  private:
    QTimer * m_poTimer;
}

Инициируйте объект таймера в вашем конструкторе

СРР-файл:

Ball::Ball(QGraphicsItem* parent) :
      QGraphicsItem(parent)
{  
  m_poTimer = new QTimer(this); // add this as a parent to control the timer resource
  m_poTimer->setInterval(4000);

  connect(m_poTimer,SIGNAL(timeout()),this,SLOT(move()));
}

void Ball::start()
{
   // start timer
   m_poTimer->start();
}

void Ball::stop()
{
   // stop timer
   m_poTimer->stop();
}
person Simon    schedule 22.11.2017
comment
спасибо, сэр, это действительно помогло мне. вы спасли мой день, сэр - person Alex D Rex; 22.11.2017
comment
@AlexDRex отлично, рад, что помог тебе :) - person Simon; 22.11.2017