QT实现“摇摇乐抽奖”(Lottery和Lottery2)

Lottery

lotterydialog.h

#ifndef LOTTERYDIALOG_H
#define LOTTERYDIALOG_H

#include <QDialog>
#include <QPainter>//画家
#include <QDir>//目录
#include <QTimer>//定时器
#include <QTime>//时间
#include <QVector>//向量容器
#include <QDebug>//打印调试

namespace Ui {
class LotteryDialog;
}

class LotteryDialog : public QDialog
{
    Q_OBJECT

public:
    explicit LotteryDialog(QWidget *parent = 0);
    ~LotteryDialog();

private slots:
    //开始按钮对应的槽函数
    void on_pushButton_clicked();
private:
    //从参选者目录中加载照片到容器中
    void loadPhotos(const QString& path);
    //定时器事件处理函数
    void timerEvent(QTimerEvent *);
    //绘图事件处理函数
    void paintEvent(QPaintEvent *);
private:
    Ui::LotteryDialog *ui;
    QVector<QImage> m_vecPhotos;//保存所有参选者照片的容器
    int m_index;//照片在容器中索引
    int m_timer;//定时器ID
    bool isStarted;//状态标记,true(开始摇奖),false(停止摇奖)
};

#endif // LOTTERYDIALOG_H




lotterydialog.cpp

#include "lotterydialog.h"
#include "ui_lotterydialog.h"

LotteryDialog::LotteryDialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::LotteryDialog)
{
    ui->setupUi(this);
    isStarted = false;//初始化未开始摇奖
    m_index = 0;//初始化索引编号
    qsrand(QTime::currentTime().msec());//设置随机数种子
    loadPhotos("./photos");//动态的从photos目录加载参选者照片,注意路径
    qDebug() << "加载到照片个数:" << m_vecPhotos.size();
}

LotteryDialog::~LotteryDialog()
{
    delete ui;
}
//开始按钮对应的槽函数
void LotteryDialog::on_pushButton_clicked()
{
    if(isStarted == false){
        isStarted = true;//摇奖开始
        ui->pushButton->setText("停止摇奖");//修改按钮文本:"停止摇奖"
        m_timer = startTimer(50);//开始定时器,每隔50毫秒到时一次
    }
    else{
        isStarted = false;//停止摇奖
        ui->pushButton->setText("开始摇奖");//修改按钮文本:"开始摇奖"
        killTimer(m_timer);//关闭定时器
    }
}
//从参选者path目录中加载照片到容器中
void LotteryDialog::loadPhotos(const QString& path)
{
    QDir dir(path);//创建目录对象
    //遍历访问当前目录下所有照片
    QStringList l1 = dir.entryList(QDir::Files);
    for(int i=0;i<l1.size();i++){
        //根据照片文件名字构造图片对象
        QImage image(path+"/"+l1.at(i));
        //保存照片到容器中
        m_vecPhotos << image;
    }
    //递归遍历子目录下的所有照片,不包括"."和".."
    QStringList l2 = dir.entryList(QDir::Dirs|QDir::NoDotAndDotDot);
    for(int i=0;i<l2.size();i++){
        loadPhotos(path+"/"+l2.at(i));
    }
}
//定时器事件处理函数(每次定时器到时都会自动被触发执行)
void LotteryDialog::timerEvent(QTimerEvent *)
{
    //随机从容器中获取一个照片对象的索引
    m_index = qrand() % m_vecPhotos.size();
    //触发绘图事件,绘制m_index对应的照片
    update();
}
//绘图事件处理函数
void LotteryDialog::paintEvent(QPaintEvent *)
{
    QPainter painter(this);//创建绘图的画家对象
    QRect rect = ui->frame->frameRect();//绘图的矩形区域
    rect.translate(ui->frame->pos());//坐标值平移,让其和painter坐标系一致
    painter.drawImage(rect,m_vecPhotos[m_index]);//绘制m_index对应的照片
}










main.cpp

#include "lotterydialog.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    LotteryDialog w;
    w.show();

    return a.exec();
}

Lottery2

lotterydialog.h

#ifndef LOTTERYDIALOG_H
#define LOTTERYDIALOG_H

#include <QDialog>
#include <QPainter>//画家
#include <QDir>//目录
#include <QTimer>//定时器
#include <QTime>//时间
#include <QVector>//向量容器
#include <QDebug>//打印调试

namespace Ui {
class LotteryDialog;
}

class LotteryDialog : public QDialog
{
    Q_OBJECT

public:
    explicit LotteryDialog(QWidget *parent = 0);
    ~LotteryDialog();

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::LotteryDialog *ui;
    QVector<QImage> m_vecPhotos;//保存所有参选者照片的容器
    int m_index;//照片在容器中索引
    //int m_timer;//定时器ID
    QTimer m_timer;//定时器对象

    bool isStarted;//状态标记,true(开始摇奖),false(停止摇奖)
};

#endif // LOTTERYDIALOG_H




lotterydialog.cpp

#include "lotterydialog.h"
#include "ui_lotterydialog.h"

LotteryDialog::LotteryDialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::LotteryDialog)
{
    ui->setupUi(this);
    isStarted = false;//初始化未开始摇奖
    m_index = 0;//初始化索引编号
    qsrand(QTime::currentTime().msec());//设置随机数种子
    loadPhotos("./photos");//动态的从photos目录加载参选者照片,注意路径
    qDebug() << "加载到照片个数:" << m_vecPhotos.size();

    //定时器到时后将会发送信号timeout
    connect(&m_timer,SIGNAL(timeout()),this,SLOT(onTimeout()));
}

LotteryDialog::~LotteryDialog()
{
    delete ui;
}
//开始按钮对应的槽函数
void LotteryDialog::on_pushButton_clicked()
{
    if(isStarted == false){
        isStarted = true;//摇奖开始
        ui->pushButton->setText("停止摇奖");//修改按钮文本:"停止摇奖"
        //m_timer = startTimer(50);//开始定时器,每隔50毫秒到时一次
        m_timer.start(50);
    }
    else{
        isStarted = false;//停止摇奖
        ui->pushButton->setText("开始摇奖");//修改按钮文本:"开始摇奖"
        //killTimer(m_timer);//关闭定时器
        m_timer.stop();
    }
}
//从参选者path目录中加载照片到容器中
void LotteryDialog::loadPhotos(const QString& path)
{
    QDir dir(path);//创建目录对象
    //遍历访问当前目录下所有照片
    QStringList l1 = dir.entryList(QDir::Files);
    for(int i=0;i<l1.size();i++){
        //根据照片文件名字构造图片对象
        QImage image(path+"/"+l1.at(i));
        //保存照片到容器中
        m_vecPhotos << image;
    }
    //递归遍历子目录下的所有照片,不包括"."和".."
    QStringList l2 = dir.entryList(QDir::Dirs|QDir::NoDotAndDotDot);
    for(int i=0;i<l2.size();i++){
        loadPhotos(path+"/"+l2.at(i));
    }
}
//定时器事件处理函数(每次定时器到时都会自动被触发执行)
/*void LotteryDialog::timerEvent(QTimerEvent *)
{
    //随机从容器中获取一个照片对象的索引
    m_index = qrand() % m_vecPhotos.size();
    //触发绘图事件,绘制m_index对应的照片
    update();
}*/
//定时器到时后执行的槽函数
void LotteryDialog::onTimeout(void)
{
    //随机从容器中获取一个照片对象的索引
    m_index = qrand() % m_vecPhotos.size();
    //触发绘图事件,绘制m_index对应的照片
    update();
}
//绘图事件处理函数
void LotteryDialog::paintEvent(QPaintEvent *)
{
    QPainter painter(this);//创建绘图的画家对象
    QRect rect = ui->frame->frameRect();//绘图的矩形区域
    rect.translate(ui->frame->pos());//坐标值平移,让其和painter坐标系一致
    painter.drawImage(rect,m_vecPhotos[m_index]);//绘制m_index对应的照片
}










main.cpp

#include "lotterydialog.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    LotteryDialog w;
    w.show();

    return a.exec();
}

C语言随机数生成教程,C语言rand和srand用法详解
http://c.biancheng.net/view/2043.html[添加链接描述]

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值