qtimer的基本工作是什么?

时间:2016-03-18 23:26:23

标签: qt

我创建了一个矩形并希望它与QTimer一起移动,我想知道QTimer的方法是如何工作的。这段代码正在运行,但我画的数字并没有移动。 的·H 头文件      #ifndef WIDGET_H

#define WIDGET_H

#include <QWidget>

namespace Ui {
class Widget;
 }

class Widget : public QWidget
{
Q_OBJECT

public:
  explicit Widget(QWidget *parent = 0);
void paintEvent(QPaintEvent *event);
~Widget();
private slots:
void update();
private:
Ui::Widget *ui;
 };

这是.cpp文件

的.cpp

#include "widget.h"
#include "ui_widget.h"
#include<QPainter>
#include<QTimer>



Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
QTimer *timer = new QTimer(this);
timer->setInterval(1000);
connect(timer, SIGNAL(timeout()), this, SLOT(update()));
timer->start();

}

Widget::~Widget()
{
delete ui;
}
void Widget::paintEvent(QPaintEvent *event)
{

 QPainter painter(this);

  painter.drawRect(50,80,70,80);

 }

 void Widget::update()

 {
 update();
 }

2 个答案:

答案 0 :(得分:1)

你说“我画的画不动”。在你的代码中,我看不到移动图形的代码,我只看到一个静态矩形被绘制。

此外,update()函数调用自身,导致无限递归。从代码中删除update(),基类实现QWidget::update()执行正确的操作(安排调用paintEvent()),无需重新实现update()

答案 1 :(得分:1)

首先,update()插槽方法已经具有特定的含义和目的,您不应该为其他目的覆盖它。此外,它不是virtual,它告诉你甚至意味着被覆盖(并且这样做会导致非常混乱的情况)。因此,将您自己的方法重命名为... updateAnimation()或其他内容。

然后你需要为你的矩形位置添加私有成员变量,比如rectXrectYrectWidthrectHeight(或者只是单QRect你比较喜欢)。一些代码片段可以帮助您实现这个想法:

void Widget::paintEvent(QPaintEvent *event)
{
     // default setting is that Qt clears the widget before painting,
     // so we don't need to worry about erasing previous rectangle,
     // just paint the new one
     QPainter painter(this);
     painter.drawRect(rectX, rectY, rectWidth, rectHeight);
 }


 void Widget::updateAnimation()
 {
     // modify rectX, rectY, rectWidth and rectHeight here
     update(); // make Qt do redrawing
 }