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

本文介绍了一个使用Qt进行绘图的例子,并通过定时器实现界面元素的动态更新。该示例展示了如何响应按键事件调整图形位置及大小,同时采用自定义绘图方式绘制动态变化的图形。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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,就调用一次重绘来重新画出小球。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值