回顾:
第一章:Qt的概述
第二章:在Ubuntu编写第一个Qt程序
第三章:Qt的字符串和字符编码
第四章:Qt的信号和槽
第五章:Qt容器窗口(父窗口)
第六章:面向对象的Qt编程
第七章:Qt设计师使用(designer)
第八章:Qt创造器的使用(qtcreator)
第九章:资源和图像
目录与定时器
1、目录类QDir
- 创建目录对象
QDir(const QString & path)
path:要访问的系统路径
绝对路径:
QDir("/home/user/Documents")
QDir("C:/Documents and Settings")
相对路径:
QDir(images/landscape.png)
- 遍历目录的方法
QStringList entryList(Filters filters)
filters:指明访问目录中有哪些内容- QDir::Files 普通文件
- QDir::QDirs 目录
- QDir::NoDotAndDotDor 不包含".“, “…”
eg:要访问”./photos"目录下所有普通文件
QDir dir("./photos");
//第一种方式
QStringList list = dir.entryList(Fiels);
for(int i=0; i<list.size(); i++){
qDebug() << list.at(i);
}
//第二种方式
foreach(QString file, dir.entryList(Fiels)){
qDebug() << file();
}
2、定时器timerEvent()
- 定时器到时候,执行定时事件处理函数
void timeEvent(QTimerEvent*);
- 开启定时器,每个interval毫秒触发一次定时事件,返回是当前定时器的ID
int startTimer(int interval)
- 停止定时器
void killTimer(int id)
案例:摇奖机
- 工程名Ernie
- 类名ErnieDialog
ErnieDialog.h
#ifndef ERNIEDIALOG_H
#define ERNIEDIALOG_H
#include <QDialog>
#include <QDir>
#include <QTime>//设置随机数
#include <QPainter>
#include <QVector>//容器
#include <QDebug>
QT_BEGIN_NAMESPACE
namespace Ui { class ErnieDialog; }
QT_END_NAMESPACE
class ErnieDialog : public QDialog
{
Q_OBJECT
public:
ErnieDialog(QWidget *parent = nullptr);
~ErnieDialog();
private:
//加载图片到容器
void loadPhotos(const QString& path);
//定时器事件处理函数
void timerEvent(QTimerEvent *);
//绘图事件处理函数
void paintEvent(QPaintEvent *);
private slots:
void on_pushButton_clicked();
private:
Ui::ErnieDialog *ui;
//容器,用于保存图片
QVector<QImage> m_vecPhotos;
int m_index;//图片索引
int m_idTimer;//定时器
bool isStarted;//状态标记:开始/停止定时器
};
#endif // ERNIEDIALOG_H
ErnieDialog.cpp
#include "ErnieDialog.h"
#include "ui_ErnieDialog.h"
ErnieDialog::ErnieDialog(QWidget *parent)
: QDialog(parent)
, ui(new Ui::ErnieDialog)
{
ui->setupUi(this);
//加载图片到容器
loadPhotos("./photos");
//设置随机种子
qsrand(QTime::currentTime().msec());
//初始化索引
m_index = 0;
//初始化状态:未开始摇奖
isStarted = false;
}
ErnieDialog::~ErnieDialog()
{
delete ui;
}
//按钮的槽函数
void ErnieDialog::on_pushButton_clicked()
{
if(isStarted == false){
isStarted = true;//开始摇奖
ui->pushButton->setText("stop");
//开启定时器,每隔50毫秒切换一张图片
m_idTimer = startTimer(50);
}
else{
isStarted = false;//停止摇奖
ui->pushButton->setText("start");
//关闭定时器
killTimer(m_idTimer);
}
}
//加载图片到容器
void ErnieDialog::loadPhotos(const QString& path)
{
//创建目录对象
QDir dir(path);
//遍历当前目录下图片
foreach (QString file, dir.entryList(QDir::Files)) {
//qDebug() << file;//测试代码
QImage image(path+"/"+file);
//保存图片对象对象到容器
m_vecPhotos << image;
}
//递归遍历子目录下的图片
foreach(QString subDir,dir.entryList(QDir::Dirs|QDir::NoDotAndDotDot)){
loadPhotos(path+"/"+subDir);
}
}
//定时器事件处理函数
void ErnieDialog::timerEvent(QTimerEvent *)
{
//从容器中随机获取一张图的索引
m_index = qrand() % m_vecPhotos.size();
//触发绘图事件,将m_index对应图片显示出来
update();
}
//绘图事件处理函数
void ErnieDialog::paintEvent(QPaintEvent *)
{
//创建画家对象
QPainter painter(this);
//获取绘图的矩形区域
QRect rcPhoto = ui->frame->frameRect();
//平移和painter使用相同坐标
rcPhoto.translate(ui->frame->pos());
//绘制容器中的第index+1的图片
painter.drawImage(rcPhoto, m_vecPhotos[m_index]);
}