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

23 篇文章 1 订阅
5 篇文章 0 订阅

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

要在Qt控制小车的上下左右移动,你需要使用Qt的图形界面和事件处理机制。以下是一个简单的示例代码,可以用来控制小车的移动。 首先,你需要创建一个QWidget类,这是一个Qt的基本窗口组件。然后,你可以在这个类中实现一些事件处理函数,例如keyPressEvent()和paintEvent()。keyPressEvent()函数可以用来处理按键事件,而paintEvent()函数可以用来绘制小车。 下面是一个简单的示例代码,用于控制小车的移动: ```cpp #include <QKeyEvent> #include <QWidget> #include <QPainter> class Car : public QWidget { public: Car(QWidget *parent = nullptr) : QWidget(parent) { x = 0; y = 0; width = 50; height = 50; } protected: void keyPressEvent(QKeyEvent *event) override { int step = 10; switch (event->key()) { case Qt::Key_Up: y -= step; break; case Qt::Key_Down: y += step; break; case Qt::Key_Left: x -= step; break; case Qt::Key_Right: x += step; break; default: break; } update(); // 重新绘制小车 } void paintEvent(QPaintEvent *event) override { QPainter painter(this); painter.fillRect(x, y, width, height, Qt::red); } private: int x; int y; int width; int height; }; ``` 在上面的代码中,我们创建了一个名为Car的QWidget类,并在构造函数中初始化了小车的位置和大小。然后,我们重写了keyPressEvent()函数,根据按下的按键来移动小车,并调用了update()函数来重新绘制小车。最后,我们重写了paintEvent()函数,用红色填充小车的矩形区域。 你可以在主函数中创建一个Car对象,并将其显示在窗口中,例如: ```cpp #include <QApplication> int main(int argc, char *argv[]) { QApplication app(argc, argv); Car car; car.show(); return app.exec(); } ``` 这样,你就可以使用方向键来控制小车的移动了。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值