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[添加链接描述]