一、定时器事件和随机数

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

参考:

56 QT定时器事件和随机数

Qt事件系统之四:定时器事件与随机数的更多相关文章

  1. 定时器事件QtimerEvent 随机数 qrand Qtimer定时器

    QTimerEvent类:定时器事件.QObject的子类都可使用  int QObject::startTimer(int interval)[参数:毫秒][返回值:定时器整型编号]来开启一个定时器 ...

  2. Qt 事件系统浅析 (用 Windows API 描述,分析了QCoreApplication::exec()和QEventLoop::exec的源码)(比起新号槽,事件机制是更高级的抽象,拥有更多特性,比如 accept/ignore,filter,还是实现状态机等高级 API 的基础)

    事件系统在 Qt 中扮演了十分重要的角色,不仅 GUI 的方方面面需要使用到事件系统,Signals/Slots 技术也离不开事件系统(多线程间).我们本文中暂且不描述 GUI 中的一些特殊情况,来说 ...

  3. Qt事件系统之三:键盘事件

    QKeyEvent类用来描述一个键盘事件.当键盘按键被按下或者被释放时,键盘事件便会被发送给拥有键盘输人焦点的部件. QKeyEvent的key()函数可以获取具体的按键,对于Qt中给定的所有按键,可 ...

  4. Qt事件系统之一:Qt中的事件处理与传递

    一.简介 在Qt中,事件作为一个对象,继承自 QEvent 类,常见的有键盘事件 QKeyEvent.鼠标事件 QMouseEvent 和定时器事件 QTimerEvent 等,与 QEvent 类的 ...

  5. Qt中的键盘事件,以及焦点的设置(比较详细)

    Qt键盘事件属于Qt事件系统,所以事件系统中所有规则对按键事件都有效.下面关注点在按键特有的部分: focus 一个拥有焦点(focus)的QWidget才可以接受键盘事件.有输入焦点的窗口是活动窗口 ...

  6. Qt经典—线程、事件与Qobject(耳目一新)

    介绍 You’re doing it wrong. — Bradley T. Hughes 线程是qt channel里最流行的讨论话题之一.许多人加入了讨论并询问如何解决他们在运行跨线程编程时所遇到 ...

  7. Qt中使用定时器(可使用QObject::timerEvent定时执行,QTimer::singleShot可只触发一次)

    在Qt中使用定时器有两种方法,一种是使用QObiect类的定时器:一种是使用QTimer类.定时器的精确性依赖于操作系统和硬件,大多数平台支持20ms的精确度 1.QObject类的定时器 QObje ...

  8. Qt经典—线程、事件与Qobject

    介绍 You’re doing it wrong. — Bradley T. Hughes 线程是qt channel里最流行的讨论话题之一.许多人加入了讨论并询问如何解决他们在运行跨线程编程时所遇到 ...

  9. Qt事件系统基本概念

    (转自:http://www.cnblogs.com/andy1987/p/3322059.html) 1. QT事件系统 Qt应用程序的消息处理是基于事件驱动的,程序的每个动作都是由某个事件所触发的 ...

随机推荐

  1. HDU3926Hand in Hand(搜索 或 并查集)

    Problem Description In order to get rid of Conan, Kaitou KID disguises himself as a teacher in the k ...

  2. Office PDF如何旋转页面之后保存

    直接视图-旋转视图-逆时针,是不行的,旋转之后无法保存,另存为之后也再打开也没有效果.   要点击视图-工具-页面   然后在右边的菜单中点击旋转,然后执行旋转,然后就可以保存了.        

  3. 到底该不该使用存储过程 MySQL查询性能优化一则

    到底该不该使用存储过程   看到<阿里巴巴java编码规范>有这样一条 关于这条规范,我说说我个人的看法 用不用存储过程要视所使用的数据库和业务场景而定的,不能因为阿里巴巴的技术牛逼,就视 ...

  4. EA生成实体类代码

    引言 在做机房个人版重构的时候,就听说了EA是一个强大的软件.仅仅只是知道的时候,已经画完了图,没有怎么用EA其它的功能,所以一直没有见识过罢了.如今到了机房合作了,想到EA一定要好好用,这样能省不少 ...

  5. win7-64bit安装comtypes的问题

    Update 28/12/2014: Please download the latest comtypes 1.1.1 from https://pypi.python.org/pypi/comty ...

  6. Python爬虫开发【第1篇】【Scrapy shell】

    Scrapy Shell Scrapy终端是一个交互终端,我们可以在未启动spider的情况下尝试及调试代码,也可以用来测试XPath或CSS表达式,查看他们的工作方式,方便我们爬取的网页中提取的数据 ...

  7. 2016/05/25 empty() 与 isset()的区别

    对于初学php的人来说,empty()和和isset()用法的区别是很难搞清楚的,他们的用法的差别不仔细去琢磨的话确实很难弄清楚. 先说一下他们的共同点: 都可以判定一个变量是否为空: 都返回bool ...

  8. RDD变换

    对Key/Value型RDD进行变换 groupBy按Key汇聚 fruit,applevegetable,cucumberfruit,cherryvegetable,beanfruit,banana ...

  9. rm -rf / – Deletes Everything!

    https://www.howtogeek.com/125157/8-deadly-commands-you-should-never-run-on-linux/

  10. 网络驱动移植之简述CS8900A网络芯片的基本原理

    CS8900A数据手册:http://www.cirrus.com/cn/products/cs8900a.html 1.概述 CS8900A是CIRRUS LOGIC公司生产的低功耗.性能优越的16 ...