Qt事件系统之四:定时器事件与随机数
一、定时器事件和随机数
QTimerEvent类用来描述一个定时器事件。对于一个QObject的子类,只需要使用int QObject::startTimer ( int interval)函数来开启一个定时器,这个函数需要输人一个以毫秒为单位的整数作为参数来表明设定的时间,它返回一个整型编号来代表这个定时器。当定时器溢出时就可以在timerEvent()函数中获取该定时器的编号来进行相关操作。
其实编程中更多的是使用QTimer类来实现一个定时器,它可以使用信号和槽,还可以设置只运行一次的定时器。所以如果使用定时器,那么一般都是使用的QTimer类。
关于随机数,在Qt中是使用qrand()和qsrand()两个函数实现的。
二、通过ID使用定时器
使用QTimerEvent的timerId()函数来获取定时器的编号,然后判断是哪一个定时器并分别进行不同的操作。
在头文件.h中进行声明:
private:
Ui::Widget *ui;
int id1,id2,id3; //定时器的编号
protected:
void timerEvent(QTimerEvent *event); //定时器事件
在.cpp中进行实现相应的功能:
//构造函数
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
id1 = startTimer(1000); //开启一个1秒定时器,并返回其id
id2 = startTimer(2000);
id3 = startTimer(4000);
}
//定时器事件
void Widget::timerEvent(QTimerEvent *event)
{
//1秒钟时间到,则定时器1溢出
if (event->timerId() == id1)
{
qDebug()<<"timer1";
}
else if(event->timerId() == id2)
{
qDebug()<<"timer2";
}
else if (event->timerId() == id3)
{
qDebug()<<"timer3";
}
}
“应用程序输出”窗口输出如下:
timer1
timer1
timer2
timer1
timer1
timer2
timer3
三、通过信号和槽实现定时器
在头文件.h中进行声明:
private slots:
void timeOut(); //定时器超时函数
在.cpp中进行实现相应的功能:
//构造函数
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
//创建一个新的定时器
QTimer *timer = new QTimer(this);
//设置定时器1秒钟超时
timer->start(1000);
//关联定时器的超时信号到槽上
connect(timer,SIGNAL(timeout()),this,SLOT(timeOut()));
}
Widget::~Widget()
{
delete ui;
}
//定时器超时函数
void Widget::timeOut()
{
QTime time = QTime::currentTime(); // 获取当前时间
QString text = time.toString("hh:mm:ss"); // 转换为字符串
if((time.second() % 2) == 0)
{
//每隔一秒就将“:”显示为空格
text[2]=' ';
text[5]=' ';
}
qDebug() << text;
}
这里在构造函数中开启了一个1秒的定时器,当它溢出时就会发射timeout()信号,这时就会执行我们的定时器溢出处理函数。在槽里我们获取了当前的时间,并且将它转换为可以显示的字符串。
“应用程序输出”窗口输出如下:
"15:36:23"
"15 36 24"
"15:36:25"
"15 36 26"
四、随机数
在头文件.h中进行声明:
private slots:
void timeOut(); //定时器超时函数
在.cpp中进行实现相应的功能:
//构造函数
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
//创建一个新的定时器
QTimer *timer = new QTimer(this);
//设置定时器1秒钟超时
timer->start(1000);
//关联定时器的超时信号到槽上
connect(timer,SIGNAL(timeout()),this,SLOT(timeOut()));
//使用qsrand()函数为随机数设置初值
qsrand(static_cast<uint>( QTime(0, 0, 0).secsTo(QTime::currentTime()) ));
}
//定时器超时函数
void Widget::timeOut()
{
int rand = qrand()%300;//产生300以内的正整数
qDebug()<< rand;
}
在使用qrand()函数产生随机数之前,一般要使用qsrand()函数为其设置初值,如果不设置初值,那么每次运行程序,qrand()都会产生相同的一组随机数。
为了每次运行程序时,都可以产生不同的随机数,我们要使用qsrand()设置一个不同的初值。这里使用了QTime类的secsTo()函数,它表示两个时间点之间所包含的秒数,比如代码中就是指从零点整到当前时间所经过的秒数。
当使用qrand()要获取一个范围内的数值时,一般是让它与一个整数取余,比如这里与300取余,就会使所有生成的数值在0-299之间。
“应用程序输出”窗口输出如下:
112
212
223
102
参考:
Qt事件系统之四:定时器事件与随机数的更多相关文章
- 定时器事件QtimerEvent 随机数 qrand Qtimer定时器
QTimerEvent类:定时器事件.QObject的子类都可使用 int QObject::startTimer(int interval)[参数:毫秒][返回值:定时器整型编号]来开启一个定时器 ...
- Qt 事件系统浅析 (用 Windows API 描述,分析了QCoreApplication::exec()和QEventLoop::exec的源码)(比起新号槽,事件机制是更高级的抽象,拥有更多特性,比如 accept/ignore,filter,还是实现状态机等高级 API 的基础)
事件系统在 Qt 中扮演了十分重要的角色,不仅 GUI 的方方面面需要使用到事件系统,Signals/Slots 技术也离不开事件系统(多线程间).我们本文中暂且不描述 GUI 中的一些特殊情况,来说 ...
- Qt事件系统之三:键盘事件
QKeyEvent类用来描述一个键盘事件.当键盘按键被按下或者被释放时,键盘事件便会被发送给拥有键盘输人焦点的部件. QKeyEvent的key()函数可以获取具体的按键,对于Qt中给定的所有按键,可 ...
- Qt事件系统之一:Qt中的事件处理与传递
一.简介 在Qt中,事件作为一个对象,继承自 QEvent 类,常见的有键盘事件 QKeyEvent.鼠标事件 QMouseEvent 和定时器事件 QTimerEvent 等,与 QEvent 类的 ...
- Qt中的键盘事件,以及焦点的设置(比较详细)
Qt键盘事件属于Qt事件系统,所以事件系统中所有规则对按键事件都有效.下面关注点在按键特有的部分: focus 一个拥有焦点(focus)的QWidget才可以接受键盘事件.有输入焦点的窗口是活动窗口 ...
- Qt经典—线程、事件与Qobject(耳目一新)
介绍 You’re doing it wrong. — Bradley T. Hughes 线程是qt channel里最流行的讨论话题之一.许多人加入了讨论并询问如何解决他们在运行跨线程编程时所遇到 ...
- Qt中使用定时器(可使用QObject::timerEvent定时执行,QTimer::singleShot可只触发一次)
在Qt中使用定时器有两种方法,一种是使用QObiect类的定时器:一种是使用QTimer类.定时器的精确性依赖于操作系统和硬件,大多数平台支持20ms的精确度 1.QObject类的定时器 QObje ...
- Qt经典—线程、事件与Qobject
介绍 You’re doing it wrong. — Bradley T. Hughes 线程是qt channel里最流行的讨论话题之一.许多人加入了讨论并询问如何解决他们在运行跨线程编程时所遇到 ...
- Qt事件系统基本概念
(转自:http://www.cnblogs.com/andy1987/p/3322059.html) 1. QT事件系统 Qt应用程序的消息处理是基于事件驱动的,程序的每个动作都是由某个事件所触发的 ...
随机推荐
- babel 用法及其 .babelrc 的配置详解,想做前端架构,拒绝一知半解...
Babel 官方介绍:将 ECMAScript 2015 及其版本以后的 javascript 代码转为旧版本浏览器或者是环境中向后兼容版本的 javascript 代码. 简而言之,就是把不兼容的 ...
- ArcEngine中IFeatureClass.Search(filter, Recycling)方法中Recycling参数的理解
转自 ArcEngine中IFeatureClass.Search(filter, Recycling)方法中Recycling参数的理解 ArcGIS Engine中总调用IFeatureCla ...
- HashMap、HashTable、TreeMap 深入分析及源代码解析
在Java的集合中Map接口的实现实例中用的比較多的就是HashMap.今天我们一起来学学HashMap,顺便学学和他有关联的HashTable.TreeMap 在写文章的时候各种问题搞得我有点迷糊尤 ...
- 微信通过openID发送消息/后台post、get提交并接收数据 C# .NET 配置404,500等错误信息 连接字符串
微信通过openID发送消息/后台post.get提交并接收数据 控制器:下面是post发送消息(微信不支持从前台发送数据,之前试过,报错,需要跨域,跨域的问题解决后还不行,最后发现之后后端提交 ...
- POJ 1936 All in All(串)
All in All Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 27537 Accepted: 11274 Descript ...
- UVA 10288 - Coupons(概率递推)
UVA 10288 - Coupons option=com_onlinejudge&Itemid=8&page=show_problem&category=482&p ...
- set 去重 会 破坏 原有list 的元素相对位置
feature_reduce_l = [i if re.search('\d', i) is None else i[0:re.search('\d', i).endpos - 1] for i in ...
- adbi命令【转】
本文转载自:https://zmywly8866.github.io/2015/01/24/all-adb-command.html ADB很强大,记住一些ADB命令有助于提高工作效率. 获取序列 ...
- HDU1176 免费馅饼 —— DP
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1176 免费馅饼 Time Limit: 2000/1000 MS (Java/Others ...
- redhat输入用户名密码后又跳回到登录
一.如果忘记密码,可以进入single模式修改密码: 1.进入linux启动界面之后按e进入如下界面 2.按选择kernel /vmlinuz-2.4.20-8 ro root=LABEL=/ 项,按 ...