首页 > 其他分享 >Qt 项目实战:幸运转盘

Qt 项目实战:幸运转盘

时间:2024-02-19 13:44:57浏览次数:25  
标签:实战 Widget pointPainter Qt rtAngle void include event 转盘

幸运电子转盘

  • 基础绘图
  • 通过paintEvent来绘图
  • 鼠标事件:鼠标左键单击开始旋转
  • Timer:定时器
  • 信号与槽
 1 #ifndef WIDGET_H
 2 #define WIDGET_H
 3 
 4 #include <QWidget>
 5 #include <QEvent>
 6 #include <QDebug>
 7 #include <QTimer>
 8 #include <QTime>
 9 #include <QMouseEvent>
10 #include <QPainter>
11 
12 QT_BEGIN_NAMESPACE
13 namespace Ui { class Widget; }
14 QT_END_NAMESPACE
15 
16 class Widget : public QWidget
17 {
18     Q_OBJECT
19 
20 public:
21     Widget(QWidget *parent = nullptr);
22     ~Widget();
23 
24 protected:
25     // 绘图事件 :显示隐藏 resize update
26     virtual void paintEvent(QPaintEvent *event);
27     virtual void mousePressEvent(QMouseEvent *event);
28 
29 
30 public slots:
31     void rtTimerOutSlot();
32     void luckStartSlot();
33 signals:
34     void luckStartSignal();
35 private:
36     Ui::Widget *ui;
37 
38 private:
39     // 堆区对象 画家
40     QPainter rotationPainter;
41     QPainter pointPainter;
42 
43     // 定时器
44     QTimer rtTimer;
45 
46     // 角度
47     qreal rtAngle;
48     int randNumber;
49 
50 };
51 #endif // WIDGET_H
 1 #include "widget.h"
 2 #include "ui_widget.h"
 3 
 4 Widget::Widget(QWidget *parent)
 5     : QWidget(parent)
 6     , ui(new Ui::Widget)
 7     ,rtAngle(0.0)
 8 {
 9     ui->setupUi(this);
10     
11     connect(this,SIGNAL(luckStartSignal()),this,
12             SLOT(luckStartSlot()));
13     
14     connect(&rtTimer,SIGNAL(timeout()),this,SLOT(rtTimerOutSlot()));
15 }
16 
17 Widget::~Widget()
18 {
19     delete ui;
20 }
21 
22 void Widget::paintEvent(QPaintEvent *event)
23 {
24     // 先准备一个画笔
25     rotationPainter.begin(this);
26     // 移动坐标
27     rotationPainter.translate(200,200);
28     // 旋转
29     rotationPainter.rotate(rtAngle);
30     // 设置反锯齿
31     rotationPainter.setRenderHints(QPainter::SmoothPixmapTransform);
32     // 0,0 为POS
33     rotationPainter.drawPixmap(-200,-200,400,400,QPixmap(":/img/1.jpg")); // pos
34     rotationPainter.end();
35     
36     // 绘制指针
37     pointPainter.begin(this);
38     pointPainter.translate(200,200);// 原点移动
39     static const QPoint point[4] = {QPoint(0,18),QPoint(20,0),
40                                     QPoint(0,-100),QPoint(-20,0)};
41     // 设置画笔
42     pointPainter.setBrush(QColor(Qt::darkBlue));
43     // 添加反锯齿(走样) 设置抗锯齿需要再绘图之前添加
44     pointPainter.setRenderHints(QPainter::Antialiasing);
45     // 描点画出多边形
46     pointPainter.drawPolygon(point, 4);
47     
48     // 多边形
49     QRect recatanle(-7,-7,14,18);
50     pointPainter.setBrush(QColor(Qt::yellow));
51     pointPainter.drawEllipse(recatanle);
52     pointPainter.end();
53 }
54 
55 void Widget::rtTimerOutSlot()
56 {
57     rtAngle++; //旋转因子
58     
59     if((rtAngle - randNumber) == 90)
60     {
61         rtTimer.setInterval(10);
62     }
63     else if((rtAngle - randNumber) == 180)
64         
65     {
66         rtTimer.setInterval(15);
67     }
68     else if((rtAngle - randNumber) == 270)
69     {
70         rtTimer.setInterval(20);
71     }
72     else if((rtAngle - randNumber) == 360)
73     {
74         rtAngle--; //停下来
75     }
76     update(); // 更新视图
77 }
78 
79 void Widget::luckStartSlot()
80 {
81     rtAngle = 1;
82     srand(QTime(0,0,0).secsTo(QTime::currentTime()));
83     randNumber = rand()%360 +180;// 180 -> 360之间
84     rtTimer.start(5);
85 }
86 
87 void Widget::mousePressEvent(QMouseEvent *event)
88 {
89     if(event->button() == Qt::LeftButton)
90     {
91         if(event->pos().x() >180 && event->pos().x()<220
92                 && event->pos().y()<216 && event->pos().y()>130)
93         {
94             emit luckStartSignal();
95         }
96     }
97     
98 }

 

标签:实战,Widget,pointPainter,Qt,rtAngle,void,include,event,转盘
From: https://www.cnblogs.com/ybqjymy/p/18020899

相关文章

  • Qt 使用Http协议通信
    介绍使用QT进行应用开发时,有时候需要进行客户端和服务端的网络通信,网络通信常用的一种协议就是http协议。QT对http协议进行了封装,下面将介绍两种http通信方式的使用。在使用http时需要在pro文件中添加对应的模块。QT+=networkhttp主要两种通信方式为get和post......
  • electron delphi winform wpf qt的对比
    Electron、Delphi、WinForms、WPF和Qt都是用于开发桌面应用程序的工具或框架,它们各自有一些独特的优点和适用场景。以下是对这些工具的简要对比:Electron:基于Web技术(HTML、CSS和JavaScript)的跨平台桌面应用程序开发框架。使用Chromium渲染引擎提供强大的页面渲染能力。适用......
  • OpenResty 介绍与实战讲解(nginx&lua)
    目录一、概述二、OpenResty安装三、OpenResty的工作原理四、OpenResty核心模块1)ngx_lua模块2)ngx_stream_lua模块3)ngx_http_lua_module模块4)ngx_http_headers_more模块5)ngx_http_echo模块6)ngx_http_lua_upstream模块7)ngx_http_redis模块8)ngx_http_proxy_connect_module......
  • 如何用Qt实现一个无标题栏、半透明、置顶(悬浮)的窗口
    在Qt框架中,要实现一个无标题栏、半透明、置顶(悬浮)的窗口,需要一些特定的设置和技巧。废话不多说,下面我将以DrawClient软件为例,介绍一下实现这种效果的四个要点。要点一:移除标题栏(去除关闭、最小化、最大化按钮)在窗口的构造函数中设置窗口的样式,在强调一下,一定要找构造函数中设置,......
  • FluentFTP实战:轻松操控FTP文件,创造高效传输体验
     概述:通过FluentFTP库,轻松在.NET中实现FTP功能。支持判断、创建、删除文件夹,判断文件是否存在,实现上传、下载和删除文件。简便而强大的FTP操作,提升文件传输效率。在.NET中,使用FluentFTP库可以方便地实现FTP的相关功能。以下是判断文件夹是否存在、文件夹的创建和删除、判断文......
  • Qt实用技巧:QCustomPlot做北斗GPS显示绝对位置运动轨迹和相对位置运动轨迹图的时,使图按
    需求  使用QCustomPlot绘制多个目标的北斗运行轨迹图,包括累计绝对位置图和记录时刻的相对位置图。  当前绘制存在问题:    交付客户前,公司内部自测流程发现的问题。  实际预期效果为:   原因  QCustomPlot加入数据是按照x轴排列,也可以按照y轴排列,使用图层......
  • QT_linux
    加载本地图片/*QPixmap类型对象*/QPixmapimage;/*加载*/image.load(":/image/cd.png");//不缩放ui->label->setScaledContents(false);//图片在标签中居中显示(水平和垂直方向均居中)ui->label->setAlignment(Qt::AlignCenter);pixbad2(":/1/bad.png");......
  • QT打包
    Qt打包程序提示“应用程序无法正常启动(0xc000007b)”/未找到Qt5Core.dll的正确解决方案先打到配置环境变量的页面 ......
  • Qt环境Windows应用程序动态变更系统默认打印机
    有些工作环境安装有多个打印机,针对不同需求进行各种输出。如果是用QPrinter进行打印控制,可以通过setPrinterName确定使用哪一个打印机,但如果程序使用了第三方功能进行打印输出,比如通过QAxObject调用系统的文字处理直接输出,就可能会遇到无法明确指定哪一个打印机的问题。这时就需要......
  • wsl 在win11上安装实战
    最近windowsstore没网速,很烦躁.所以手动安装wsl,遇到了非常多的坑.https://learn.microsoft.com/en-us/windows/wsl/install-manual这里面下载ubuntu我选的这个https://aka.ms/wsl-ubuntu-1804因为这个版本小.500多mb实在找不到下载地址的可以看这个:直接扔迅雷里面......