使用Qt实现基于定时器的摇奖机

1、项目架构

2、UI界面设计

3、实现代码

erintDialog.h 文件
#ifndef ERINEDIALOG_H
#define ERINEDIALOG_H

#include <QDialog>
#include <QDebug>
#include <QTimer>       // 定时器
#include <QDir>         // 目录 操作
#include <QPainter>     // 绘图事件
#include <QTime>        // 时间(随机数种子)
#include <QVector>      // 向量容器
#include <QImage>       // 图片

QT_BEGIN_NAMESPACE
namespace Ui { class ErineDialog; }
QT_END_NAMESPACE

class ErineDialog : public QDialog
{
    Q_OBJECT

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

private slots:
    void on_pushButton_clicked();

private:
    // 加载图片到容器功能
    void loadPhotos(const QString &path);

//    // 定时器事件处理函数
//    void timerEvent(QTimerEvent *);

    // 绘图事件处理函数
    void paintEvent(QPaintEvent *);

private slots:
    void onTimeout(void) ;



private:
    Ui::ErineDialog *ui;

    // 保存图片的容器
    QVector<QImage> m_vecPhotos ;

    // 图片在容器中的索引
    int m_index ;

    // 定时器
    // int m_timer;
    QTimer m_timer;

    // 标记: true正在摇奖, false停止摇奖
    bool isStarted;



};
#endif // ERINEDIALOG_H

erintDialog.cpp 文件

#include "erinedialog.h"
#include "ui_erinedialog.h"

ErineDialog::ErineDialog(QWidget *parent)
    : QDialog(parent)
    , ui(new Ui::ErineDialog)
{
    ui->setupUi(this);
    // 初始化
   m_index = 0;
   isStarted = false ;

   // 设置随机数种子
   qsrand(QTime::currentTime().msec()) ;

   // 加载"./phoros"下所有的图片到容器的功能
   loadPhotos("./photos");
   qDebug() << "加载图片的个数:" << m_vecPhotos.size();

   connect(&m_timer, SIGNAL(timeout()), this, SLOT(onTimeout()));

}

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


// 开始按钮对应的槽函数
void ErineDialog::on_pushButton_clicked()
{
    if(isStarted == false)
    {
        isStarted  = true;  // 摇奖开始
//        m_timer = startTimer(50);  // 50ms切换一张图片
         m_timer.start(50);
        ui->pushButton->setText("停止") ;
    }
    else
    {
        isStarted  = false; // 摇奖结束
//        killTimer(m_timer);  // 关闭定时器
        m_timer.stop();
        ui->pushButton->setText("开始");
    }
}


// 加载图片到容器功能
void ErineDialog::loadPhotos(const QString &path)
{
    QDir dir(path);
    // 遍历当前目录所有图片(所有的普通文件)
    QStringList list1 = dir.entryList(QDir::Files) ;
    for(int i=0; i < list1.size(); i++)
    {
        // 获取相应图片对象
        QImage image(path + "/" + list1.at(i));
        m_vecPhotos << image ;  // 将图片对象写入到容器
    }

    // 递归遍历子目录中的图片(但是不包括 "." 和 "..")
    QStringList list2 = dir.entryList(QDir::Dirs|QDir::NoDotAndDotDot);
    for(int i = 0; i < list2.size(); i++)
    {
        loadPhotos(path + "/" + list2.at(i));
    }
}

// 定时器事件处理函数
/*
void ErineDialog::timerEvent(QTimerEvent *)
{
    // 获取随机数
    m_index = qrand() % m_vecPhotos.size();

    // 刷新当前界面,触发绘图事件的执行
    update();
}*/

// 定时器槽函数
void ErineDialog::onTimeout(void)
{
    // 获取随机数
    m_index = qrand() % m_vecPhotos.size();

    // 刷新当前界面,触发绘图事件的执行
    update();
}

// 绘图事件处理函数
void ErineDialog::paintEvent(QPaintEvent *)
{
    // 1. 创建画家对象
    QPainter painter(this);

    // 2. 获取绘图所在矩形区域
    QRect rect = ui->frame->frameRect();

    // 3. 坐标值平移,使rect 和 printer使用相同的坐标系
    rect.translate(ui->frame->pos()) ;

    //  4. 使用painter将image图片画到rect上
    painter.drawImage(rect, m_vecPhotos[m_index]);

}

main.cpp 文件

#include "erinedialog.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    ErineDialog w;
    w.show();
    return a.exec();
}

4、运行 效果

未完待续


有疑问的小伙伴可以留言一起交流讨论!!!

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值