我创建了一个矩形并希望它与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();
}
答案 0 :(得分:1)
你说“我画的画不动”。在你的代码中,我看不到移动图形的代码,我只看到一个静态矩形被绘制。
此外,update()
函数调用自身,导致无限递归。从代码中删除update()
,基类实现QWidget::update()
执行正确的操作(安排调用paintEvent()
),无需重新实现update()
。
答案 1 :(得分:1)
首先,update()
插槽方法已经具有特定的含义和目的,您不应该为其他目的覆盖它。此外,它不是virtual
,它告诉你甚至意味着被覆盖(并且这样做会导致非常混乱的情况)。因此,将您自己的方法重命名为... updateAnimation()
或其他内容。
然后你需要为你的矩形位置添加私有成员变量,比如rectX
,rectY
,rectWidth
,rectHeight
(或者只是单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
}