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、运行 效果
未完待续
有疑问的小伙伴可以留言一起交流讨论!!!