Qt定时器和随机数详解

环境是:Windows 7 + Qt 4.8.1 +Qt Creator 2.4.1

一、定时器

Qt中有两种方法来使用定时器,一种是定时器事件,另一种是使用信号和槽。一般使用了多个定时器时最好使用定时器事件来处理。

1.新建Qt Gui应用,项目名称为myTimer,基类选择QWidget,类名为Widget。

2.到widget.h文件中添加函数声明:
protected:
    void timerEvent(QTimerEvent *);
然后添加私有变量定义:
int id1, id2, id3;

3.下面到设计模式,向界面上拖入两个标签部件Label。

4.下面进入widget.cpp文件,先在构造函数中添加如下代码:

id1 = startTimer(1000); // 开启一个1秒定时器,返回其ID
id2 = startTimer(2000);
id3 = startTimer(10000);

这里开启了三个定时器,分别返回了它们的id,这个id用来区分不同的定时器。定时器的时间单位是毫秒。每当一个定时器溢出时,都会调用定时器事件处理函数,我们可以在该函数中进行相应的处理。

5.下面添加定时器事件处理函数的定义:

void Widget::timerEvent(QTimerEvent *event)
{
  if (event->timerId() == id1) {    // 判断是哪个定时器
    ui->label->setText(tr("%1").arg(qrand()%10));
  }
  else if (event->timerId() == id2) {
    ui->label_2->setText(tr("hello world!"));
  }
  else {
    qApp->quit();
  }
}

这里先使用timerId()函数返回了溢出的定时器的id,然后根据该id来判断是哪个定时器溢出了,并进行相应的处理。每当第一个定时器溢出时都产生一个小于10的随机数;当第二个定时器溢出时,就更改标签的文本;当第三个定时器溢出时则退出应用程序。现在可以运行程序,查看效果。

6.如果只是想开启少量的定时器,也可以使用信号和槽来实现。
先在widget.h中添加一个私有槽声明:

private slots:
  void timerUpdate();

然后到设计模式向界面上添加一个行编辑器部件Line Edit,再到widget.cpp中添加头文件包含:

#include <QTimer>
#include <QDateTime>

然后在构造函数中添加如下代码:

QTimer *timer = new QTimer(this);
//关联定时器溢出信号和相应的槽函数
connect(timer, SIGNAL(timeout()), this, SLOT(timerUpdate()));
timer->start(1000);

这里创建了一个定时器,并将其溢出信号和更新槽关联起来,最后使用start()函数来开启定时器。
下面添加timerUpdate()函数的定义:

void Widget::timerUpdate()
{
  //获取系统现在的时间
  QDateTime time = QDateTime::currentDateTime();
  //设置系统时间显示格式
  QString str = time.toString("yyyy-MM-dd hh:mm:ss dddd");
  //在标签上显示时间
  ui->lineEdit->setText(str);
}

这里在行编辑器中显示了当前的时间。现在可以运行程序,查看效果。

二、随机数

关于随机数,在Qt中是使用qrand()和qsrand()两个函数实现的。在前面的程序中已经看到了qrand()函数的使用,其可以产生随机数,qrand()%10可以产生0-9之间的随机数。要想产生100以内的随机数就是%100。以此类推。
在使用qrand()函数产生随机数之前,一般要使用qsrand()函数为其设置初值,如果不设置初值,那么每次运行程序,qrand()都会产生相同的一组随机数。为了每次运行程序时,都可以产生不同的随机数,我们要使用qsrand()设置一个不同的初值。这里使用了QTime类的secsTo()函数,它表示两个时间点之间所包含的秒数,比如代码中就是指从零点整到当前时间所经过的秒数。

下面先在widget.cpp的构造函数中添加如下代码:

qsrand(QTime(0, 0, 0).secsTo(QTime::currentTime()));

然后在timerUpdate()函数的最后添加如下代码:

int rand = qrand() % 300;      // 产生300以内的正整数
ui->lineEdit->move(rand, rand);

这样,每过一秒,行编辑器都会移动到一个随机的位置。大家可以运行程序,查看效果。

以上所述就是本文的全部内容了,希望大家能够喜欢。

(0)

相关推荐

  • 利用QT写一个极简单的图形化Python闹钟程序

    今天我们讲一下用Python写的GUI小程序.一个小闹钟(只是屏幕提示,没有声音哦) 让我们先介绍这个闹钟如何奇葩. 需要通过命令行启动. 没有标题栏. 没菜单. 甚至没有关闭按钮. 没有运行界面. 看到这里想必大家要问了,何必去做一个这样弱爆了的程序呢.显然,教育意义大于其实际用处. 像其他的模块一样,QT界面包是需要加载的. 我们用到了命令行输入,所以,sys模块也是必须的. 用到了时间,但是我们不需要使用time模块,我们用QT提供的QTime模块. 让我们先写import 语句部分. i

  • jquery.qtip提示信息插件用法简单实例

    本文实例讲述了jquery.qtip提示信息插件用法.分享给大家供大家参考,具体如下: 公司要求写一个关于提示信息的效果,在网上查询到了这个插件,感觉很不错,下面是自己学习的内容 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns=&q

  • Bootstrap树形组件jqTree的简单封装

    一.组件效果预览 其实效果和之前的那个差不多,博主只是在之前的基础上加了一个选中的背景色. 全部收起 展开 全部展开 二.代码示例 其实效果很简单,重点来看看代码是如何实现封装的.还是老规矩,将已经实现的代码贴出来,然后再来一步一步讲解. (function ($) { //使用js的严格模式 'use strict'; $.fn.jqtree = function (options) { //合并默认参数和用户传过来的参数 options = $.extend({}, $.fn.jqtree.

  • Qt如何设置窗口屏幕居中显示以及设置大小

    Qt如何设置窗口屏幕居中显示以及设置大小 设置窗口居中显示 方法一:在窗口(QWidget类及派生类)的构造函数中添加如下代码: #include <QDesktopWidget> //....... QDesktopWidget* desktop = QApplication::desktop(); // =qApp->desktop();也可以 move((desktop->width() - this->width())/2, (desktop->height()

  • jQuery表单美化插件jqTransform使用详解

    jQuery Form表单美化插件jqTransform,非常实用的jQuery插件,自动把你整个Form表单进行美化处理,包括SELECT下拉框.文本框.单选.复选框.按钮等,当然不支持input file文件选择框,这个可以参照我们之前的input file选择框美化教程进行改造,在浏览器兼容方面,兼容 ie 6+, safari 2+, firefox 2+,插件还是很不错的,使用起来也很简单,推荐学习和使用. 使用方法: 1.加载jQuery和插件 <script type="te

  • 用PyQt进行Python图形界面的程序的开发的入门指引

    一般来说,选择用于应用程序的 GUI 工具箱会是一件棘手的事.使用 Python(许多语言也一样)的程序员可以选择的 GUI 工具箱种类繁多,而每个工具箱都有各自的优缺点.有些速度比其它工具箱快,有些比较小:有些易于安装,有些更适合于跨平台使用(对于这一点,还要指出,有些支持您需要满足的特定特性).当然,各种库都相应具有各种许可证. 对于 Python 程序员而言,缺省的 GUI 选择是 Tk(通过 Tkinter 绑定)- 其原因显而易见.Tkinter 和闲置的 IDE 是由 Python

  • Bootstrap轮播插件中图片变形的终极解决方案 使用jqthumb.js

    在顶求网的首页中我使用了BootStrap的轮播(carousel)插件来展示文章中的图片.我在程序中自动抓取文章的第一张图片作为该轮播控件中要显示的图片,由于文章的图片大小不一,而轮播插件的大小基本是固定的,所以展示的时候图片出现了变形.在网上找了很多中方式也没有解决(过程曲折,不再赘述),直到找到了这款Jquery的缩放插件--jqthumb.js.下面来看看如何使用它以及如何利用它来控制轮播控件中图片的大小,而且能够做到不变形,可以显示图片的主要部分(类似于微信朋友圈的图片混排效果--不知

  • Windows下Eclipse+PyDev配置Python+PyQt4开发环境

    本文为大家分享了Windows下配置Python PyQt4开发环境的详细步骤,供大家参考,具体内容如下 1. 下载相关软件 Eclipse下载地址:http://www.eclipse.org/downloads/ JRE下载地址:http://www.java.com/zh_CN/download/manual.jsp PyDev下载地址: http://sourceforge.net/projects/pydev/ Python下载地址:http://www.python.org/geti

  • Qt定时器和随机数详解

    环境是:Windows 7 + Qt 4.8.1 +Qt Creator 2.4.1 一.定时器 Qt中有两种方法来使用定时器,一种是定时器事件,另一种是使用信号和槽.一般使用了多个定时器时最好使用定时器事件来处理. 1.新建Qt Gui应用,项目名称为myTimer,基类选择QWidget,类名为Widget. 2.到widget.h文件中添加函数声明: protected:     void timerEvent(QTimerEvent *); 然后添加私有变量定义: int id1, id

  • java中生成任意之间数的随机数详解

    这篇文章主要介绍了java中生成任意之间数的随机数详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 public static int cssjs(int a,int b) { Random rand=new Random(); int zhi; zhi=rand.nextInt(b)%(b-a+1)+a; return zhi; } 我们观察其Random对象的nextInt(int)方法,发现这个发现这个方法将生成 0 ~ 参数之间随机取

  • 对python周期性定时器的示例详解

    一.用thread实现定时器 py_timer.py文件 #!/usr/bin/python #coding:utf-8 import threading import os import sys class _Timer(threading.Thread): def __init__(self, interval, function, args=[], kwargs={}): threading.Thread.__init__(self) self.interval = interval se

  • Jmeter固定定时器的使用详解

    目录 场景举例特殊说明 特殊说明 补充: 统一随机定时器 准确的吞吐量定时器 常数吞吐量定时器 Jmeter之固定定时器的使用 Jmeter的线程组在发送2个请求之间需要设置一个等待时间时,可以用固定定时器解决. 场景举例特殊说明 Jmeter的线程组在发送2个请求之间需要设置一个等待时间时,可以用固定定时器解决. 场景举例 顺序发送2个http请求,在第一个http请求发送完成之后,需要加一个等待时间,再发送第二个http请求. 配置方式,如图所示,在第2个请求中添加->定时器->固定定时器

  • Python生成随机数详解流程

    目录 一.随机数种子 二.生成随机数 1.random() 2.ranint(a,b) 3.randrange(start,stop[,step]) 4.getrandbits(k) 三.生成随机序列 1.choice(seq) 2.samplex(序列,k) 3.shuffle(x[,random]) 一.随机数种子 为什么要提出随机数种子呢?咱们前面提到过了,随机数均是模拟出来的, 想要模拟的比较真实,就需要变换种子函数内的数值,一般以时间戳为随机函数种子. 例如以下案例,将随机数种子固定的

  • Go语言实现控制台输入&生成随机数详解

    1. 不同基础类型之间的转化 对于不同的基础类型之间的转化,Go 提供了 strconv包.它实现了字符串与其他基本数据类型之间的转化. 其中最常用的数值转化函数是Atoi和ltoa Atoi 方法可以将字符串类型的数值直接转化为int类型的数值,而 ltoa 可以将 int 类型的数值转化为string类型的值. 示例:控制台输入一个数值,进行数据大小的比较 package main import ( "fmt" "strconv" ) func main() {

  • Go语言排序算法之插入排序与生成随机数详解

    前言 排序,对于每种编程语言都是要面对的.这里跟大家一起分享golang实现一些排序算法,并且说明如何生成随机数.下面话不多说了,来一起看看详细的介绍吧. 经典排序算法 算法的学习非常重要,是检验一个程序员水平的重要标准.学习算法不能死记硬背,需要理解其中的思想,这样才能灵活应用到实际的开发中. 七大经典排序算法 插入排序 选择排序 冒泡排序 希尔排序 归并排序 堆排序 快速排序 插入排序 先考虑一个问题:对于长度为n的数组,前n-1位都是递增有序的,如何排序? 1.从第1位至第n-1位遍历数组

  • Qt计时器使用方法详解

    本文实例为大家分享了Qt计时器的使用方法,供大家参考,具体内容如下 计时器 在我们的日常设计程序中,经常需要固定时间段来刷新界面或者处理一些事务,这个时候计时器就很重要. 比如说在用Qt设计一个时间显示程序时 我们若想让这个标签实时变动,计时器就是个很好的方法. 计时器类QTimer 我们先看看它的信号-槽机制 public Q_SLOTS:     void start(int msec);     void start();     void stop(); Q_SIGNALS:     v

  • Java中的随机数详解

    在java中我们可以使用java.util.Random类来产生一个随机数发生.它有两个构造函数,分别是Random()和Random(long seed).Random()是用当前时间即System.currentTimeMillis()作为发生器的种子,而Random(long seed)是用指定的seed作为发生器的种子. 当随机数发生器就是Random对象产生以后,可以通过对象调用不同的方法:nextInt().nextLong().nextFloat().nextDouble()等来获

  • jdk自带定时器使用方法详解

    首先看一下jdk自带定时器: 一种工具,线程用其安排以后在后台线程中执行的任务.可安排任务执行一次,或者定期重复执行.与每个 Timer 对象相对应的是单个后台线程,用于顺序地执行所有计时器任务.计时器任务应该迅速完成.如果完成某个计时器任务的时间太长,那么它会"独占"计时器的任务执行线程.因此,这就可能延迟后续任务的执行,而这些任务就可能"堆在一起",并且在上述不友好的任务最终完成时才能够被快速连续地执行. schedule(TimerTask task,long

随机推荐