【QT开发】乒乓球碰撞反弹demo

在编写代码时,无意弄出来了一个这个东西,觉得挺有意思的记录一下,类似乒乓球在矩形内一直运动碰撞反弹demo

头文件

#ifndef MYPROJECT_H
#define MYPROJECT_H

#include <QMainWindow>
#include <QPainter>
#include "form.h"

QT_BEGIN_NAMESPACE
namespace Ui { class MyProject; }
QT_END_NAMESPACE

class MyProject : public QMainWindow
{
    Q_OBJECT

public:
    MyProject(QWidget *parent = nullptr);
    ~MyProject();



    Form *m_form;

public:
    QTimer *timer;

    int m_x;
    int m_y;
    int m_type_x;
    int m_type_y;

private slots:
    void updateProgressBar();

    void on_pushButton_clicked();

    void on_pushButton_2_clicked();

    void on_pushButton_3_clicked();

private:
    Ui::MyProject *ui;
};
#endif // MYPROJECT_H
#include "myproject.h"
#include "ui_myproject.h"
#include <QDebug>

MyProject::MyProject(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MyProject)
    ,m_y(1)
    ,m_x(1)
    ,m_type_x(0)
    ,m_type_y(0)
{
    ui->setupUi(this);






    // 初始化定时器
    timer = new QTimer(this);
    connect(timer, &QTimer::timeout, this, &MyProject::updateProgressBar);

    timer->setInterval(100);
 
    timer->start();

    ui->label->setGeometry(this->rect());





    ui->label->setStyleSheet("background:transparent");

    QPixmap pixmap(ui->label->size()); // 创建一个与QLabel大小相同的QPixmap
    QPainter painter(&pixmap);
    painter.setRenderHint(QPainter::Antialiasing); // 抗锯齿
    painter.setPen(QPen(Qt::black, 2)); // 设置画笔
    painter.setBrush(Qt::lightGray); // 设置画刷
    QRect rect(100, 100, ui->label->width()-200, ui->label->height()-200); // 矩形的位置和大小


    // 定义一个线段,从(50, 50)到(200, 200)
    int startX = (ui->label->width() / 20.0) * 1;
    int startY = ((ui->label->height()) / 10.0) * 1;
    int endX = (ui->label->width() / 20.0) * 1;
    int endY = ((ui->label->height()) / 10.0) * 9;
    painter.drawLine(startX, startY, endX, endY);



    startX = (ui->label->width() / 20.0) * 1;
    startY = ((ui->label->height()) / 10.0) * 9;
    endX = (ui->label->width() / 20.0) * 19;
    endY = ((ui->label->height()) / 10.0) * 9;
    painter.drawLine(startX, startY, endX, endY);


    painter.setPen(QPen(Qt::black, 2)); // 设置画笔


    for(int i = 1; i < 10; i++)
    {

        startX = (ui->label->width() / 20.0) * 1;
        startY = ((ui->label->height()) / 10.0) * i;
        endX = (ui->label->width() / 20.0) * 19;
        endY = ((ui->label->height()) / 10.0) * i;

        if(i == 1 || i == 9)
        painter.drawLine(startX, startY, endX, endY);
    }


    for(int i = 1; i < 20; i++)
    {
        startX = (ui->label->width() / 20.0) * i;
        startY = ((ui->label->height()) / 10.0) * 1;
        endX = (ui->label->width() / 20.0) * i;
        endY = ((ui->label->height()) / 10.0) * 9;

        if(i == 1 || i == 19)
        painter.drawLine(startX, startY, endX, endY);
    }


    ui->label->setPixmap(pixmap); // 将QPixmap设置为QLabel的内容
}

MyProject::~MyProject()
{
    delete ui;
}



void MyProject::updateProgressBar()
{
    ui->label->setGeometry(this->rect());
    QPixmap pixmap(ui->label->size()); // 创建一个与QLabel大小相同的QPixmap
    QPainter painter(&pixmap);
    painter.setRenderHint(QPainter::Antialiasing); // 抗锯齿
    painter.setPen(QPen(Qt::black, 2)); // 设置画笔
    painter.setBrush(Qt::lightGray); // 设置画刷
    QRect rect(100, 100, ui->label->width()-200, ui->label->height()-200); // 矩形的位置和大小



    // 定义一个线段,从(50, 50)到(200, 200)
    int startX = (ui->label->width() / 20.0) * 1;
    int startY = ((ui->label->height()) / 10.0) * 1;
    int endX = (ui->label->width() / 20.0) * 1;
    int endY = ((ui->label->height()) / 10.0) * 9;
    painter.drawLine(startX, startY, endX, endY);



    startX = (ui->label->width() / 20.0) * 1;
    startY = ((ui->label->height()) / 10.0) * 9;
    endX = (ui->label->width() / 20.0) * 19;
    endY = ((ui->label->height()) / 10.0) * 9;
    painter.drawLine(startX, startY, endX, endY);


    painter.setPen(QPen(Qt::black, 2)); // 设置画笔


    for(int i = 1; i < 10; i++)
    {
        startX = (ui->label->width() / 20.0) * 1;
        startY = ((ui->label->height()) / 10.0) * i;
        endX = (ui->label->width() / 20.0) * 19;
        endY = ((ui->label->height()) / 10.0) * i;

        if(i == 1 || i == 9)
        painter.drawLine(startX, startY, endX, endY);
    }


    for(int i = 1; i < 20; i++)
    {
        startX = (ui->label->width() / 20.0) * i;
        startY = ((ui->label->height()) / 10.0) * 1;
        endX = (ui->label->width() / 20.0) * i;
        endY = ((ui->label->height()) / 10.0) * 9;

        if(i == 1 || i == 19)
        painter.drawLine(startX, startY, endX, endY);
    }


    painter.setPen(QPen(Qt::red, 5)); // 设置画笔
    painter.setBrush(Qt::lightGray); // 设置画刷



    startX = (ui->label->width() / 20.0) * m_x;
    startY = ((ui->label->height()) / 10.0) * m_y;
    endX = (ui->label->width() / 20.0) * (m_x+1);
    endY = ((ui->label->height()) / 10.0) * (m_y+1);



    if(m_y >= 8)
    {
        m_type_y = 1;
    }
    else if(m_y <= 1)
    {
        m_type_y = 0;
    }


    if(m_x >= 18)
    {
        m_type_x = 1;
    }
    else if(m_x <= 1)
    {
        m_type_x = 0;
    }


    if(m_type_y)
    {
        m_y--;
    }
    else
    {
        m_y++;
    }

    if(m_type_x)
    {
        m_x--;
    }
    else
    {
        m_x++;
    }


    QBrush redBrush(Qt::red);
    painter.fillRect(startX, startY, (ui->label->width() / 20.0), (ui->label->height()) / 10.0, redBrush);

    ui->label->setPixmap(pixmap);

}

void MyProject::on_pushButton_clicked()
{
    timer->start();
}


void MyProject::on_pushButton_2_clicked()
{
    timer->stop();
}


void MyProject::on_pushButton_3_clicked()
{

}

运行效果:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MQTT是一种轻量级的消息传输协议,适合于低带宽、高延迟和不稳定网络环境下的即时通讯。QT是一种跨平台的应用程序开发框架,支持图形用户界面开发、数据库操作、网络应用等。 为了开发MQTT Demo,需要先安装MQTT客户端库,例如MQTT C++客户端库mosquitto_cpp。然后在QT工程中添加mosquitto_cpp头文件和库文件,设置相关编译器选项,并编写业务逻辑。 MQTT Demo主要包括如下功能: 1. 连接MQTT服务器:包括设置MQTT服务器地址、端口号、用户名和密码等参数,建立MQTT连接。 2. 订阅主题:设计订阅主题,过滤器和QoS等参数,实现接收服务器端发来的消息。 3. 发布消息:设置发布消息的主题、内容和QoS等参数,通过MQTT客户端发送数据到服务器端。 4. 断开连接:在程序结束前,对MQTT连接进行正常关闭。 在开发过程中,需要注意以下几点: 1. 异步消息回调机制:mosquitto_cpp提供了异步消息回调机制,需要在类继承mosqpp::mosquittopp时,重载on_message函数,实现接收MQTT消息。 2. 线程安全问题:MQTT连接需要在独立线程中执行,避免阻塞界面操作。 3. 数据结构设计:使用Qt提供的数据结构,如QByteArray、QString等,方便消息的编解码操作。 MQTT Demo开发需要较强的C++编程能力和熟练运用Qt开发工具,若要实现更为复杂的功能,还需要深入掌握MQTT协议和mosquitto_cpp库的使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值