ICode9

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

手把手教你开发-滚动效果号码抽奖(QT)

2022-01-19 09:04:18  阅读:185  来源: 互联网

标签:抽奖 QT 号码 手把手 void height num qf


本文从头开发教你开发一个带滚动效果的抽奖软件。最终效果如下:

源码在文章最后

软件开发的第一步是需求分析,其实好的开发人员就是半个产品经理,我相信很多开发者都被产品经理坑过,需求一变再变,所以我们要在开发之前就把需求问清楚,越细越完善越好,尤其是面对领导编程的时候更加需要把需求明确下来。

正确的方向才会得到正确的结果,错误的方向再怎么努力也不会有好的结果。

一、需求分析

不知道你遇到过这样的需求吗?通常是一句话,在这个抽奖软件中,客户也只是给了一句话:“我想要一个带滚动效果的抽奖,在晚会上面使用。”

如果只是满足他的这个一句话的需求,那么软件开发完成客户肯定不会满意。我们需要在开发之前确定一些隐藏的功能点。

例如:

1、需不需要音乐?背景音乐和滚动音乐。

这个项目案例中未开发,但是实际场景中肯定是需要的。

2、抽奖的触发方式是什么?有没有额外的硬件按钮、鼠标控制还是键盘控制。

这个项目案例未开发,但是实际场景中可以需要适配硬件按钮,蓝牙或者无线等通信触发。

3、需要不需要指定中将号码?

开发过抽奖的软件的工程师一般都不会相信所谓的抽奖软件了。

项目中开发了该功能。

4、需要不需要将抽奖数据保存在文件中?

这个功能是肯定需要的,项目中预留的保存数据接口。

5、字体颜色会随时改变吗?

使用过程中,客户有时候会喜欢改变字体颜色显得更加高大上,尤其是户外的显示屏的颜色和开发过程中的效果可能不一样,因此可能需要针对具体的显示屏和环境进行调整背景图片以及颜色。

项目中预留了颜色调整的接口。

二、软件设计

有了需求其实就可以针对需求进行设计。

框架设计

软件框架图如下:

 RollingLotteryView : 抽奖窗口类,主要管理抽奖停止循序,已经抽奖的背景图等。

NumItem:抽奖号码类,每个抽奖号码的管理,号码滚动效果都在这里类中完成。

接口:

接口   说明

setItemBackground(QImage img)

设置每一个抽奖号码的背景

bool setItemColor(QColor color)

设置抽奖号码的颜色

bool setBackground(QImage img)

设置整体的大背景图

void start()

开始抽奖
void stop(int res=-1)结束抽奖,如果设置数据那么会在指定的数据下停止

void sigStop(int num)

信号,抽奖结束后会触发该信号,

用户可以通过绑定该信号获取抽奖结果

流程设计

用户调用start接口,触发每一个num_item的定时器,然后让每一个号码转动起来。启动流程如下:

暂停流程比较复杂,因为需要逐个停止,因此每一个停止之后需要告诉主页面触发下一个号码的停止,流程图如下:

 

 关键算法

void NumItem::on_timer_timeout()
{
    // 数字号码的高度。
    m_height += 5;
    QFont qf;
    qf.setPointSize(2);
    qf.setPixelSize(100);
    QFontMetrics qfm(qf);
    int b = qfm.height(); // 计算字高
    // 当移动高度大于字体高度的时候认为该字体已经被隐藏掉了
    if (m_height > b) {
        m_height = m_height % b;
        // 数字循环
        if (m_num == 0) {
            m_num = 9;
        }
        else {
            m_num--;
        }   
       
        if (!m_status) {
             // 是否指定了结果,如果指定结果那么就行等到指定的结果才停止。
            if(m_resNum == -1){
                sigStop(m_num);
                m_timer->stop();
            }
            else if(m_resNum == m_num){
                sigStop(m_num);
                m_timer->stop();
            }
        }
    }
    update();
}
void NumItem::paintEvent(QPaintEvent *)
{
    QPainter p(this);
    QFont qf;
    QPen pen(m_color);
    p.setPen(pen);
    qf.setPointSize(2);
    qf.setPixelSize(100);
    QFontMetrics qfm(qf);
    int a = qfm.width("1");
    int b = qfm.height();
    p.setFont(qf);
    // 由于要做滚动效果,因此需要画两个字
    // 由于高度不断的变高,那么呈现出滚动的效果。
    p.drawText(0, m_height, a, b, 1, QString::number(m_num));
    p.drawText(0, m_height - b, a, b, 1, QString::number(m_num - 1));
    if (m_imgBackground.isNull()) {
        return;
    }
    QPainter painter(this);
    QRect target(0, 0, this->size().width(), this->size().height());
    painter.drawImage(target, m_imgBackground);
}

git源码传送门

标签:抽奖,QT,号码,手把手,void,height,num,qf
来源: https://blog.csdn.net/arv002/article/details/122548254

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

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

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

ICode9版权所有