1. 程式人生 > >QT利用button控制小球上下左右移動

QT利用button控制小球上下左右移動

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>
intmain(intargc,char*argv[])
{
QApplicationa(argc,argv);
Widgetw;
w.show();
returna.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(newUi::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=newQTimer
(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()
{
deleteui;
}
voidWidget::paintEvent(QPaintEvent*)
{
QPainterp(this);
QPenpen;
pen.setWidth(5);
pen.setColor(Qt::black);
p.setPen(pen);
QConicalGradientcon(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);
QBrushbrush(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);*/
}
voidWidget::numAdd()
{
length+=6;
angle+=6;
if(length>=this->width())
{
length=-100;
}
}
voidWidget::on_upBtn_clicked()
{
ylength-=10;
//update()每次呼叫都可以啟動重繪
update();
}
voidWidget::on_rightBtn_clicked()
{
xlength+=10;
update();
}
voidWidget::on_leftBtn_clicked()
{
xlength-=10;
update();
}
voidWidget::on_downBtn_clicked()
{
ylength+=10;
update();
}

ui介面


下面是效果圖


學到的東西, 每按一次button    就啟動一次槽函式,然後利用update()呼叫一次重繪。每按一次button,就呼叫一次重繪來重新畫出小球。