ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

半小时教你做大转盘游戏(QT篇)

2021-12-01 09:03:42  阅读:265  来源: 互联网

标签:src const QT int void 大转盘 教你做 MainWindow painter


本文讲述如何在linux系统使用QT开发一个简易的大转盘游戏。
操作系统:uos、debian
qt版本:Qt version 5.11.3
在这里插入图片描述

大转盘的制作其实很简单,大转盘的整体思想是这样,
1.定时器用来刷新大转盘的界面这样就有动态的旋转效果,
2.监听键盘事件,通过键盘控制大转盘的开关,然后判断当前的状态是已经开始还是停止,如果状态是停止那么就启动定时器,如果状态是开始就关闭定时器,
3. 绘制界面内容。

新建项目

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
我们的项目中不实用到.ui文件。

定时器使用

QTimer:定时器类主要作用是按照固定间隔时间发送定时器信号,我们通过监听定时信号处理信号内容,修改指针角度,刷新界面内容就可以了。

start() // 启动定时器,设置启动以后会按照固定时间发送信号
stop() // 关闭定时器,关闭之后不再发送定时信号。
setInterval(int) // 设置定时时长,按照毫秒 1秒=1000毫秒 

键盘按键响应

继承父类keyPressEvent(QKeyEvent *event)函数,监听键盘事件。
当用户按下键盘的时候会触发这个监听事件。
QKeyEvent 键盘事件相关的类。我们可以从这个类中获取键盘的内容,例如按下了什么按钮。

    int key() ;// 获取键盘按键的key值
#ifndef QT_NO_SHORTCUT
    bool matches(QKeySequence::StandardKey key) const;
#endif
    Qt::KeyboardModifiers modifiers() const;
    inline QString text() const { return txt; }
    inline bool isAutoRepeat() const { return autor; }
    inline int count() const { return int(c); }

    inline quint32 nativeScanCode() const { return nScanCode; }
    inline quint32 nativeVirtualKey() const { return nVirtualKey; }
    inline quint32 nativeModifiers() const { return nModifiers; }

图片绘制

// 加载背景图片
QImage img("://bk.png");
// 将图片绘制到界面中
painter->drawImage(0,0,img);

图片按照中心旋转

图片旋转需要根据长宽计算偏移量。

QPixmap MainWindow::rotateImageWithTransform(const QPixmap &src, int angle)
{
    QMatrix matri;
    //迁移到中心
    matri.translate(src.width()/2.0,src.height()/2.0);
    //中心旋转
    matri.rotate(angle);
    //回退中心
    matri.translate(-src.width()/2.0,-src.height()/2.0);
    //执行坐标映射变化
    //旋转后图像大小变化了 需要提前进行裁剪 如果在旋转后裁剪
    //则需要计算使用三角函数计算
    //中心偏移
    int cubeWidth = qMin(src.width(),src.height());
    QRect cubeRect(0,0,cubeWidth,cubeWidth);
    cubeRect.moveCenter(src.rect().center());
    auto retImg = src.copy(cubeRect);
    retImg = retImg.transformed(matri,Qt::SmoothTransformation);
    return retImg;
}

源码:
mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();
    QTimer * m_fTimer;
    bool m_status;
    int m_time ;
    QPixmap rotateImageWithTransform(const QPixmap &src, int angle);
private:
    void drawBackground(QPainter *painter);     // 绘制背景
    void drawPointe(QPainter *painter);         // 绘制指针
public slots:
    void on_timer_timeout();
protected:
    void paintEvent(QPaintEvent *event);		// update函数执行会触发重绘。
    void keyPressEvent(QKeyEvent *event);		// 按钮消息响应
};

#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include <QPainter>
#include <QTimer>
#include <QKeyEvent>
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent),
      m_fTimer(new QTimer(this)),
      m_status(false),
      m_time(0)
{
    setWindowTitle("幸运大转盘");	// 修改窗口标题
    setFixedSize(500,500);		// 更新串口大小
    m_fTimer->stop();
    m_fTimer->setInterval(10);	// 设置定时器
    connect(m_fTimer,SIGNAL(timeout()),this,SLOT(on_timer_timeout()));
}

MainWindow::~MainWindow()
{

}

void MainWindow::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    drawBackground(&painter);		// 绘制背景。
    drawPointe(&painter);			// 绘制指针。
}

void MainWindow::drawBackground(QPainter *painter)
{
    QImage img("://bk.png");
    painter->drawImage(0,0,img);
}

void MainWindow::drawPointe(QPainter *painter)
{
     QPixmap img("://3.png");
     int rangle = 20*m_time;
     if(rangle % 30 ==0){
         rangle +=1;
     }
     img = rotateImageWithTransform(img,rangle);
     painter->drawPixmap(0,0,500,500,img);
}

void MainWindow::keyPressEvent(QKeyEvent *event)
{
    if(event->key() == Qt::Key_Return){
        if(m_status){
            m_status = false;
            m_fTimer->stop();
        }
        else{
            m_status = true;
            m_fTimer->start();
        }
    }
}


QPixmap MainWindow::rotateImageWithTransform(const QPixmap &src, int angle)
{
    QMatrix matri;
    //迁移到中心
    matri.translate(src.width()/2.0,src.height()/2.0);
    //中心旋转
    matri.rotate(angle);
    //回退中心
    matri.translate(-src.width()/2.0,-src.height()/2.0);
    //执行坐标映射变化
    //旋转后图像大小变化了 需要提前进行裁剪 如果在旋转后裁剪
    //则需要计算使用三角函数计算
    //中心偏移
    int cubeWidth = qMin(src.width(),src.height());
    QRect cubeRect(0,0,cubeWidth,cubeWidth);
    cubeRect.moveCenter(src.rect().center());
    auto retImg = src.copy(cubeRect);
    retImg = retImg.transformed(matri,Qt::SmoothTransformation);
    return retImg;
}

void MainWindow::on_timer_timeout()
{
    m_time ++;
    if(m_time == 360/20){
        m_time = 0;
    }
    update();
}

标签:src,const,QT,int,void,大转盘,教你做,MainWindow,painter
来源: https://blog.csdn.net/arv002/article/details/121003833

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有