【问题标题】:QTimer with QPaintEvent带有 QPaintEvent 的 QTimer
【发布时间】:2014-04-18 18:53:23
【问题描述】:

我创建了一个小型 QT 应用程序,它在随机位置重绘一个圆圈。 我想做的是重复该方法 预定 次,使用 QTimer 每秒 绘制圆。

我不知道该怎么做。

这是我的 ma​​in.cpp

int main(int argc, char *argv[]) {
    // initialize resources, if needed
    // Q_INIT_RESOURCE(resfile);

     srand (time(NULL));
    QApplication app(argc, argv);

    widget f;
    f.show();

    return app.exec();
}

widget.cpp

#include "widget.h"

widget::widget()
{
   widget.setupUi(this);
}
void widget::paintEvent(QPaintEvent * p)
{
QPainter painter(this);
//**code


   printcircle(& painter); //paints the circle

    //**code
}

void paintcircle(QPainter* painter)
{
   srand (time(NULL));
   int x = rand() %200 + 1;
   int y = rand() %200 + 1;

   QRectF myQRect(x,y,30,30);
   painter->drawEllipse(myQRect);


    }


widget::~widget()
{}

widget.h

#ifndef _WIDGET_H
#define _WIDGET_H

class widget : public QWidget {
    Q_OBJECT
public:
    widget();
    virtual ~widget();

public slots:
    void paintEvent(QPaintEvent * p);  
    private:
    Ui::widget widget;
};

#endif  /* _WIDGET_H */

我将如何创建一个 Qtimer 来重复 printcicle() 方法。

谢谢

【问题讨论】:

    标签: c++ qt qpainter qtcore qtimer


    【解决方案1】:

    您可以在您的小部件类构造函数中创建一个计时器:

     QTimer *timer = new QTimer(this);
     connect(timer, SIGNAL(timeout()), this, SLOT(update()));
     timer->start(1000);
    

    即它会每秒调用小部件的绘制事件。

    【讨论】:

      【解决方案2】:

      是的,为了实现这一点,需要在您的代码中修改一些内容:

      • 转发声明一个 QTimer

      • 添加 QTimer 成员

      • 包括 QTimer 标头。

      • 在您的小部件类的构造函数中设置一个连续的 QTimer。

      • 确保将连接设置为update 插槽,以便事件循环安排重绘。

      • 您需要为预定的时间添加一个计数器,因为 QTimer 中没有内置这样的功能。

      • 您需要将该变量初始化为零。

      • 您需要在每个插槽调用中递增。

      • 您需要停止为 QTimer 发出超时信号。

      为了实现上述所有目标,您的代码将变成这样:

      widget.cpp

      #include "widget.h"
      
      #include <QTimer>
      
      // Could be any number
      const static int myPredeterminedTimes = 10;
      
      widget::widget()
          : m_timer(new QTimer(this))
          , m_count(0)
      {
          widget.setupUi(this);
          connect(m_timer, SIGNAL(timeout()), SLOT(update()));
          timer->start(1000);
      }
      void widget::paintEvent(QPaintEvent * p)
      {
      QPainter painter(this);
      //**code
      
      
         printcircle(& painter); //paints the circle
      
          //**code
      }
      
      void widget::paintcircle(QPainter* painter)
      {
         srand (time(NULL));
         int x = rand() %200 + 1;
         int y = rand() %200 + 1;
      
         QRectF myQRect(x,y,30,30);
         painter->drawEllipse(myQRect);
      
      
          }
      
      
      widget::~widget()
      {}
      

      小部件.h

      #ifndef _WIDGET_H
      #define _WIDGET_H
      
      class QTimer;
      
      class widget : public QWidget {
          Q_OBJECT
      public:
          widget();
          virtual ~widget();
      
      public slots:
          void paintEvent(QPaintEvent * p);  
          private:
          Ui::widget widget;
      
      private:
          QTimer *m_timer;
          int m_count;
      };
      
      #endif  /* _WIDGET_H */
      

      【讨论】:

      • 在paintEvent(QPaintEvent *) 之外使用QPainter 将不起作用(qt-project.org/faq/answer/…)。正确的做法是将计时器的信号连接到 update() 插槽,然后让 paintEvent() 在那里进行适当的绘图。此外,在每次调用时动态分配一个新的 QPainter 对象(并且永远不会删除它)最终会耗尽所有 RAM。
      • @JeremyFriesner:已修复。
      猜你喜欢
      • 1970-01-01
      • 2021-03-12
      • 2022-07-21
      • 1970-01-01
      • 2019-02-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-03
      • 1970-01-01
      相关资源
      最近更新 更多