widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QTimer>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
protected:
void paintEvent(QPaintEvent *);
void numAdd();
private slots:
void on_upBtn_clicked();
void on_rightBtn_clicked();
void on_leftBtn_clicked();
void on_downBtn_clicked();
private:
Ui::Widget *ui;
QTimer *timer;
int length;
int angle;
int xlength;
int ylength;
};
#endif // WIDGET_H
main.cpp
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QPainter>
#include <QPen>
#include <QBrush>
#include <QConicalGradient>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
//设置button和键盘连接
ui->upBtn->setShortcut(Qt::Key_Up);
ui->downBtn->setShortcut(Qt::Key_Down);
ui->leftBtn->setShortcut(Qt::Key_Left);
ui->rightBtn->setShortcut(Qt::Key_Right);
this->resize(1080,720);
timer = new QTimer(this);
timer->start(1000);
//update函数的作用就是去调用重绘处理函数
connect(timer,SIGNAL(timeout()),this,SLOT(update()));
connect(timer,SIGNAL(timeout()),this,SLOT(numAdd()));
length = 0;
angle = 0;
xlength = 0;
ylength = 0;
}
Widget::~Widget()
{
delete ui;
}
void Widget::paintEvent(QPaintEvent *)
{
QPainter p(this);
QPen pen;
pen.setWidth(5);
pen.setColor(Qt::black);
p.setPen(pen);
QConicalGradient con(QPoint(0,0),0);
con.setColorAt(0, Qt::white);
con.setColorAt(60.0/360, Qt::red);
con.setColorAt(120.0/360, Qt::yellow);
con.setColorAt(180.0/360, Qt::blue);
con.setColorAt(240.0/360, Qt::green);
con.setColorAt(300.0/360, Qt::black);
con.setColorAt(1.0, Qt::cyan);
QBrush brush(con);
p.setBrush(brush);
p.drawLine(0,250, this->width(), 250);
p.translate(QPoint(length+50+xlength, 200+ylength));
p.rotate(angle);
p.drawEllipse(QPoint(0,0), 50,50);
/* //保存原来的设置
p.save();
pen.setColor(Qt::red);
p.setPen(pen);
p.drawLine(0,300, this->width(), 300);
//恢复原来的设置
p.restore();
p.drawLine(0,100, this->width(), 100);*/
}
void Widget::numAdd()
{
length += 6;
angle += 6;
if(length >= this->width())
{
length = -100;
}
}
void Widget::on_upBtn_clicked()
{
ylength -=10;
//update() 每次调用都可以启动重绘
update();
}
void Widget::on_rightBtn_clicked()
{
xlength+=10;
update();
}
void Widget::on_leftBtn_clicked()
{
xlength-=10;
update();
}
void Widget::on_downBtn_clicked()
{
ylength +=10;
update();
}
ui界面
下面是效果图
学到的东西, 每按一次button 就启动一次槽函数,然后利用update()调用一次重绘。每按一次button,就调用一次重绘来重新画出小球。