QT利用button控制小球上下左右移動
阿新 • • 發佈:2019-02-16
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,就呼叫一次重繪來重新畫出小球。