QT:如何每秒循环一个方法? C ++

时间:2014-04-15 18:32:51

标签: c++ qt loops qtimer

我创建了一个在小部件上显示圆圈的Qt项目。 然后我有一个方法,每次调用方法时都会在不同的位置重绘圆圈。 我想要的是在for循环中运行该方法,比如十次,并且每隔一秒显示圆圈被重绘的10个位置中的每一个。

有些事情:

void method::paintEvent(QPaintEvent * p)
{

//code

    for(int i=0; i<10;i++)//do this every second
    {
       method(circle[i]); //co-ordinates change
       circle[i].pain( & painter); //using QPainter
    }

//code

}

我读过QTimer,但不知道如何使用它。睡眠功能不起作用。

4 个答案:

答案 0 :(得分:3)

正如您所猜测的,QTimer是在此使用的正确机制。怎么去设置它?

这是一个选项:

class MyClass : public QObject
{
   public:
   MyClass():i(0)
   {
       QTimer::singleShot(1000,this,SLOT(callback()));//or call callback() directly here
   } //constructor

   protected:
   unsigned int i;
   void paintEvent(QPaintEvent * p)
   {    
     //do your painting here  
   }

   public slots:
   void callback()
   {
      method(circle[i]); //co-ordinates change
      //circle[i].pain( & painter); //don't use QPainter here - call update instead
      update();
      ++i;//increment counter
      if(i<10) QTimer::singleShot(1000,this,SLOT(callback()));
   }

}

答案 1 :(得分:0)

尝试这样的事情:

class MyDrawer : public QObject
{
    Q_OBJECT
    int counter;
    QTimer* timer;

public:
    MyDrawer() : QObject(), counter(10)
    {
        timer = new QTimer(this);
        connect(timer, SIGNAL(timeout()), this, SLOT(redraw()));
        timer->start(1000);
    }

public slots:
    void redraw()
    {
        method(circle[i]); //co-ordinates change
        circle[i].pain( & painter);

        --counter;
        if (counter == 0) timer->stop();
    }

};

不要忘记在此文件上运行moc,但如果您的类是QObject,则可能已经执行过了。

答案 2 :(得分:0)

您需要做的就是从计时器事件中触发update()update()方法会在小部件上安排paintEvent

paintEvent 之外的小部件上绘画是无效的 - 这是我在发布此答案时所有其他答案所犯的错误。仅仅调用paintEvent方法不是一种解决方法。你应该致电update()。调用repaint()也可以,但只有在您了解update()的差异并且有充分理由这样做时才会这样做。

class Circle;

class MyWidget : public QWidget {
  Q_OBJECT
  QBasicTimer m_timer;
  QList<Circle> m_circles;
  void method(Circle &);
  void paintEvent(QPaintEvent * p) {
    QPainter painter(this);
    // WARNING: this method can be called at any time
    // If you're basing animations on passage of time,
    // use a QElapsedTimer to find out how much time has
    // passed since the last repaint, and advance the animation
    // based on that.
    ...
    for(int i=0; i<10;i++)
    {
       method(m_circles[i]); //co-ordinates change
       m_circles[i].paint(&painter);
    }
    ...
  }
  void timerEvent(QTimerEvent * ev) {
    if (ev->timerId() != m_timer.timerId()) {
      QWidget::timerEvent(ev);
      return;
    }
    update();
  }
public:
  MyWidget(QWidget*parent = 0) : QWidget(parent) {
    ...
    m_timer.start(1000, this);
  }
};

答案 3 :(得分:-1)

Try this.

for(int i=0; i<10;i++)//do this every second
{
   method(circle[i]); //co-ordinates change
   circle[i].pain( & painter);
   sleep(1000);// you can also use delay(1000);

}

使用sleep()声明的函数sleep(int ms),使得程序等待指定的毫秒时间。