QT:目录和定时器

来源:互联网 发布:京麦工作台和淘宝助理 编辑:程序博客网 时间:2024/05/22 03:01

目录和定时器

QVector  线性表容器类
QVector<T>

QDir  遍历目录的方法类
QDir dir (path);

foreach QT中的for循环,关键字:
 QLinkedList<QString> list;
 ...
 QString str;
 foreach (str, list) {
  qDebug() << str;
 }

定时器事件,由QObject提供;定时器信号,由QTimer 提供

通过定时器实现定时:
// 开启定时器
int QObject::startTimer (int interval);
 参数:interval 毫秒,每隔interval触发一次定时器事件
 返回值:成功返回定时器ID,失败返回0

// 定时器事件处理
void QObject::timerEvent (QTimerEvent* e) [virtual];

// 结束定时器
void QObject::killTimer (int id);
 参数:id 是开启定时器返回值

《案例》摇奖机
1 )工程目录名 Ernie
2 )类名和文件名 ErnieDialog
3 )组件
 m_labName
 m_labClock
 属性:
  frameshape: panel
  frameshadow: sunken
  autofilebackground: √
  palettr: 继承--调色板--双击--修改颜色
  font: 设置字体
 m_fmPhoto
 属性:
  frameshape: box
  垂直策略:expanding
 m_btnStart
 属性:
  font: 大小 16
  文本: 开始
  enable: 去掉√,禁用按钮

/** 代码演示 - 基于目录和定时器的摇奖机 **/

// .h 头文件 #ifndef ERNIEDIALOG_H#define ERNIEDIALOG_H#include <QDialog>#include <QVector> // 容器类#include <QPair> // 模板类(能够存储一对儿对象)#include <QDir> // 遍历目录类#include <QTime> // 时间类#include <QPainter> // 画家类namespace Ui {class ErnieDialog;}class ErnieDialog : public QDialog {    Q_OBJECTpublic:    explicit ErnieDialog(QWidget *parent = 0);    ~ErnieDialog();private slots:    void on_m_btnStart_clicked();private:    // 绘制图片事件的虚函数    void paintEvent (QPaintEvent* );    // 定时器事件处理虚函数    void timerEvent (QTimerEvent* );    // 更新显示人名    void updateName (int idxPhoto);    // 更新显示摇奖时间    void updateClock (int secClock);    // 加载指定目录下的所有图片到容器中,参数:路径    void loadPhotos (const QString & path);private:    // 保存所有图片的容器,每个元素都是QPair    QVector< QPair<QString, QImage> > m_vecPhotos;    // 图片索引    int m_idxPhoto;    // 每次摇奖剩余的时间:秒    int m_secClock;    // 换图片的定时器    int m_idtPhoto;    // 更新显示时间的定时器    int m_idtClock;    // 摇奖停止定时器    int m_idtStop;private:    Ui::ErnieDialog *ui;};#endif // ERNIEDIALOG_H

// .cpp 源文件#include "ErnieDialog.h"#include "ui_ErnieDialog.h"ErnieDialog::ErnieDialog(QWidget *parent) :    QDialog(parent),    ui(new Ui::ErnieDialog) {    ui->setupUi(this);    // 加载指定目录下图片,注意路径    loadPhotos ("./images");    qDebug ("test"); // 调试输出 test    if (! m_vecPhotos.empty ()) {        // 设置随机种子,调用当前系统的毫秒做随机种子数字        qsrand (QTime::currentTime ().msec ());        // 从容器中随机取出一张初始图片        m_idxPhoto = qrand () % m_vecPhotos.size (); // size() 获取容器中元素个数        // 根据索引显示图片        updateName (m_idxPhoto);        updateClock (m_secClock = 0);        ui->m_btnStart->setEnabled (true);    }}ErnieDialog::~ErnieDialog() {    delete ui;}// 开始按钮槽函数void ErnieDialog::on_m_btnStart_clicked() {    // 禁用开始按钮    ui->m_btnStart->setEnabled (false);    // 设置摇奖时间    m_secClock = 5; // 每隔 5 秒摇出1个奖    // 更新显示时间    updateClock (m_secClock);    // 开始切换图片:50ms    m_idtPhoto = startTimer (20); // 每隔50毫秒换1张图片    m_idtClock = startTimer (1000); // 每隔1秒更新一次显示时间    // 5s 以后停止倒时    m_idtStop = startTimer (1000 * 5);}// 绘制图片事件的虚函数void ErnieDialog::paintEvent (QPaintEvent*) {    qDebug ("%s", __func__); // 测试函数调用    // 如果容器中图片是否为空    if (! m_vecPhotos.empty ()) {        QPainter painter (this);        QRect rcPhoto = ui->m_fmPhoto->frameRect (); // 矩形框        rcPhoto.translate (ui->m_fmPhoto->pos ());        painter.drawImage (rcPhoto, m_vecPhotos[m_idxPhoto].second);    }}// 定时器事件处理虚函数void ErnieDialog::timerEvent (QTimerEvent* event) {    // event->timerId () :获取当前定时器ID    // 换图片定时器倒时    if (event->timerId () == m_idtPhoto) {        // 随机取出一张图片        m_idxPhoto = qrand () % m_vecPhotos.size ();        // 更新显示图片        update ();        // 更新显示人名        updateName (m_idxPhoto);    }    // 更新显示时间定时器倒时    else if (event->timerId () == m_idtClock) {        updateClock (--m_secClock);    }    // 停止摇奖定时器倒时    else if (event->timerId () == m_idtStop) {        // 关闭所有的定时器        killTimer (m_idtClock);        killTimer (m_idtPhoto);        killTimer (m_idtStop);        // 使能开始按钮        ui->m_btnStart->setEnabled (true);    }}// 更新显示人名void ErnieDialog::updateName (int idxPhoto) {    ui->m_labName->setText (m_vecPhotos[idxPhoto].first);}// 更新显示摇奖时间void ErnieDialog::updateClock (int secClock) {    QString str = QTime (0, 0, secClock).toString ("hh:mm:ss");    ui->m_labClock->setText (str);}// 加载指定目录下的所有图片到容器中,参数:路径void ErnieDialog::loadPhotos (const QString & path) {    // 构建目录对象    QDir dir (path);    // 遍历普通文件    foreach (QString file, dir.entryList (QDir::Files)) {        QString name = file;        // 去掉后缀,图片名.jpg  --->  图片名 // .的下标是几,就返回从左到右多少个字符        name.resize (name.lastIndexOf ('.'));        // 构建图片对象  ./photo/xxx.jpg        QImage image (path + '/' + file);        // 构建QPair对象存到容器中        m_vecPhotos << qMakePair (name, image);    }    // 递归遍历子目录,不包括".",".."    foreach (QString subDir, dir.entryList (QDir::Dirs | QDir::NoDotAndDotDot)) {        loadPhotos (path + '/' + subDir);    }}


《案例》摇奖机 - 【总结】

QPaintEvent
绘制事件类 - 画图形的事件
 // 绘制图片事件的虚函数
 void QWidget::paintEvent(QPaintEvent * event) [virtual];
QVector 容器类 // 同C++容器类一样用,动态数组类
QPair 模板类  // 能够存储一对儿对象
 // 构建QPair对象
 QPair<T1, T2> qMakePair(const T1 & value1, const T2 & value2);
 eg:// m_vecPhotos 为容器对象,把name和image构建放到容器中
 QVector<QPair<QString, QImage> >  m_vecPhotos;
 m_vecPhotos << qMakePair (name, image);

QDir 遍历目录类
 // 使用path路径构建一个目录对象
 QDir::QDir(const QString & path = QString());  
 // QDir类里的成员函数,返回文件列表中所有文件/目录名称字符串
 QStringList entryList(const QStringList & nameFilters) const;
 eg:// 文件夹中文件的遍历
 QDir dir (path);
    foreach (QString file, dir.entryList (QDir::Files)) {  ...  }

QTime 时间类
 // 定时器事件处理的虚函数
 void QTimer::timerEvent(QTimerEvent * e) [virtual];
 QTime QTime::currentTime() [static]; // 返回系统当前时间
 eg:  // 以毫秒为单位设置随机数种子
 qsrand (QTime::currentTime ().msec () );
 // 获取当前定时器ID
 int QTimerEvent::timerId() const;
 // 杀死定时器标示符ID,定时器标示符返回开始时间,启动1个定时事件
 void QObject::killTimer(int id);    // ---> startTimer()

setEnabled ( bool )
 // 设置按钮的禁用与使能能点击
    ui->m_btnStart->setEnabled (true);
    ui->m_btnStart->setEnabled (false);
 // 设置50毫秒的时间,属于QObject
 startTimer(50);     // 50-millisecond timer

lastIndexOf ( const QString & )
 // 返回索引一个字符串中末次出现位置,搜索从最后向索引位置。
 int QString::lastIndexOf(const QString & str) const;
 eg:// 去掉后缀,图片名.jpg  --->  图片名 // .的下标是几,就返回从左到右多少个字符
 name.resize (name.lastIndexOf ('.'));

0 0
原创粉丝点击