预备步骤(完成界面设计和图片的准备工作)
两个按钮,一个开始,一个暂停,当开始按下,去执行对应的槽函数,在该槽函数里面使用开始计时,设置1s中断一次去切换一下照片,暂停会停止计时器记时,界面设计,使用两个按钮,一个开始,一个暂停,用一个标签来放图片
修改名称,以及对象名称,便于编程
开始按钮对象命名为startbutton,暂停按钮对象命名为stopbutton
准备图片:
将你准备好的图片放在一个文件夹,并用1,2,3,4这种命名,以便于切换
路径为D:\12
编程
1.将开始按钮转到槽,编写槽函数,需要当开始按钮按下,开始计时,需要调用QObject中的startTimer,因为Widget将这个函数继承下来,可以直接用,参数为ms,就是多少毫米去执行对应的中断函数,我们可以定义一个宏,来表示定时时间
也就是定时1s,因为可能有好多个定时器,startTimer的返回值为定时器的编号,我们使用一个变量来记录他
所以开始按钮的槽函数为这样
void Widget::on_startbutton_clicked()
{
eventid=this->startTimer(TIMEOUT);
}
开始按钮按下,执行该函数,到1s的时候,会去执行中断函数,而这个中断函数是在QObject中的,而Widget是他的派生类,我们可以使用多态,来重写基类的中断函数,实现我们的功能
在widget.cpp中实现该功能,首先我们需要在构造函数里面先贴一张图片,在定义一个变量PID,每次1s中断,改变PID的值,也是改变图片的名称,之前用1,2,3,4,5来命名的,先在构造函数中贴一张图片,使用
PID=2,说明第一次中断,直接就加载第二张图片了,然后实现中断函数,我们说中断函数是用来切换照片的,我们可以使用一个字符串,因为每个图片不同的只有图片的名称不一样,我们只需要中断一次,改变PID值就可以了
void Widget::timerEvent(QTimerEvent*event)
{
if(event->timerId()!=eventid)//event是计时的计算器的结构体,看他的编号是不是我们关心的计时器编号,如果不是,直接跳出
{return ;}
QString str="D:\\12\\"; //拼接每个图片路径
str+=QString::number(PID);//图片名称转字符串
str+=".jpg";//图片后缀
QPixmap pix(str);//构建图片对象
ui->label->setPixmap(pix);//图片对象插入标签
PID++;//下次中断,图片名会修改
if(PID==11) //图片名切换
PID=1;
}
演示:
相册切换
我们发现只能显示一个角,我们可以在ui界面下,点击标签
会调节图片大小
图片适应
实现暂停:
将暂停键转到槽
void Widget::on_stopbutton_clicked()
{
this->killTimer(eventid);
}
使用killTimer,然后参数为要暂停的定时器的编号
完整演示:
完整演示
整体代码
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include<QString>
#include <QWidget>
#define TIMEOUT 1*1000
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
virtual void timerEvent(QTimerEvent*event);
private slots:
void on_startbutton_clicked();
void on_stopbutton_clicked();
private:
Ui::Widget *ui;
int eventid;
int PID;
};
#endif // WIDGET_H
widget.cpp
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
PID=2;
QPixmap pix("D:\\12\\1.jpg");
ui->label->setPixmap(pix);
}
Widget::~Widget()
{
delete ui;
}
void Widget::timerEvent(QTimerEvent*event)
{
if(event->timerId()!=eventid)
{return ;}
QString str="D:\\12\\";
str+=QString::number(PID);
str+=".jpg";
QPixmap pix(str);
ui->label->setPixmap(pix);
PID++;
if(PID==11)
PID=1;
}
void Widget::on_startbutton_clicked()
{
eventid=this->startTimer(TIMEOUT);
}
void Widget::on_stopbutton_clicked()
{
this->killTimer(eventid);
}