本文讲述如何在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_SHORTCUTbool matches(QKeySequence::StandardKey key) const;
#endifQt::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_OBJECTpublic: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();
}

半小时教你做大转盘游戏(QT篇)相关推荐

  1. 1小时教你做360度全景“小星球”效果图 Skillshare – Create a Panoramic ‘Little Planet’ from Anywhere

    1小时教你做360度全景"小星球"效果图 Skillshare – Create a Panoramic 'Little Planet' from Anywhere 1小时教你做3 ...

  2. python手机版做小游戏代码大全-Python大牛手把手教你做一个小游戏,萌新福利!...

    原标题:Python大牛手把手教你做一个小游戏,萌新福利! 引言 最近python语言大火,除了在科学计算领域python有用武之地之外,在游戏.后台等方面,python也大放异彩,本篇博文将按照正规 ...

  3. 中国移动大转盘游戏次数限制

    上一篇说到的Random,就是之前我做仿制中国移动流量大转盘的游戏, 当时遇到一个问题就是怎么限制用户玩游戏的次数,因为当时写的程序经 过测试,每次重启程序,用户有可以玩到相同的次数,后面和朋友谈论( ...

  4. PHP做大转盘抽奖的思路,jQuery实现幸运大转盘(php抽奖程序)抽奖程序

    抽奖程序有各式各样的形式,其中幸运大转盘最为常见.线上线下都有很多的使用场景. 本文结合我自己的php网站,是实现一个php抽奖程序. 下图是该抽奖程序的截图: 一般的抽奖程序主要是算法程序,界面效果 ...

  5. 用unity 做一个转盘游戏

    此游戏为课堂小测验,下面为大家分享代码思路 本转盘为转盘动,中间指针不动,不过指针动也是和此demo大同小异 下面为示意图 下面为全部代码(有详细注释) using System.Collection ...

  6. 手把手教你做抽奖转盘(自定义alert(弹出框

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! < ...

  7. PHP做大转盘抽奖的思路,jQuery+PHP实现微信转盘抽奖功能的方法

    本文实例讲述了jQuery+PHP实现微信转盘抽奖功能的方法.分享给大家供大家参考,具体如下: 本文结合实例将使用jQuery和PHP来实现转盘抽奖程序. 准备工作 首先要准备素材,抽奖的界面用到两张 ...

  8. 手把手教你做抽奖转盘(自定义alert()弹出框)

    <!DOCTYPE html> <html lang="zh-cn"><head><meta charset="UTF-8&qu ...

  9. cad常青藤插件_原来还有这么好用的CAD插件,半小时就能做完一张图

    作为一名优秀的设计师或者建筑师,如果你没用过逆天的CAD插件,我觉得不行,所以下面小编就给大家推荐几个非常好用的CAD插件,希望可以帮助大家大幅提升工作效率. 接下来小编就带大家一起看看吧! 1.天正 ...

最新文章

  1. python中内建函数isinstance的用法
  2. PLSQL_解析过程及硬解析和软解析的区别(案例)
  3. string.Format字符串格式化说明(转)
  4. Android自动填充短信验证码
  5. 第九节:委托和事件(1)(委托的发展历史、插件式编程、多播委托)
  6. android 判断 string 是否是字母数字,Android中判断字符串中必须包含字母或者数字...
  7. xdf文件转换成pdf在线_在线PDFtodoc转换器智能转换PDF文件
  8. composer更新不成功,启用国内镜像网站的配置更改办法
  9. SVN下载、安装、配置及使用方法
  10. 有限元分析简单实例之平面矩形薄板(matlab)
  11. js正则只能输入大于0的正整数
  12. Datawhale集成学习笔记:熟悉机器学习的三大主要任务
  13. 游戏角色/3D电影逼真写实角色是如何制作出来的?
  14. 美颜sdk动态贴纸是什么?
  15. Win11打不开安全中心怎么解决
  16. Win10图标变白纸了,恢复方法
  17. linux操作系统应用实训,linux操作系统应用实训报告.docx
  18. qt5使用内存检测工具vld查看内存泄漏
  19. Centos磁盘管理
  20. W phase 学习

热门文章

  1. 一种基于最大吸收功率的卫星太阳能电池板安装方案
  2. 华为云服务器安装Linux并实现本地连接访问
  3. 白鲸优化(BWO)算法(含MATLAB代码)
  4. 为什么signed char的范围是-128~127
  5. 基于pgpool-II读写分离+postgresql10主从从流复制高可用部署方案
  6. jiffies与HZ、定时器、原子操作
  7. APIO2014 连珠线
  8. ADM打不开/data,或打开后无法导出里面的文件
  9. 物联网的云计算、雾计算、边缘计算和MIST计算的基本概念
  10. wps excel查找不定位_【WPS神技能】如何在WPSExcel表格中批量查找两列数据的不同?...