第十章:目录与定时器

回顾:
第一章: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]);
}

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值