Qt定时器和随机数详解

Qt定时器和随机数详解

一、什么是Qt定时器

Qt定时器用于在一定时间间隔内执行任务,可以实现定时刷新UI、定时发送消息等功能。它与用户界面线程一起循环运行,并在主线程中处理事件,因此可以避免在主线程中阻塞任务的情况。

1.1 创建定时器

要创建一个定时器,我们可以使用QTimer类。比如:

QTimer *timer = new QTimer(this);

使用new操作符创建一个定时器对象,这个定时器它是属于某个对象的,并可以被该对象的信号槽机制进行管理,这里我们将其父对象设置为this

1.2 启动定时器

我们可以使用start()方法启动一个定时器:

timer->start(1000);

这里启动了一个间隔为1秒的定时器。我们还可以使用下面这个方法修改时间间隔:

timer->setInterval(500);

1.3 停止定时器

可以使用stop()方法停止定时器:

timer->stop();

二、什么是Qt随机数

Qt提供了一个qrand()函数来生成随机数。我们可以在需要的地方调用该函数,这是一个线程安全的函数。

2.1 生成随机数

使用qrand()函数来生成一个随机数,比如:

int number = qrand() % 100;

这里生成了一个0到99之间的随机数。对于想要更加随机的数,我们还可以使用下面这个函数:

qsrand(QDateTime::currentMSecsSinceEpoch() / 1000);

这里是使用当前时间作为随机数生成器的种子,从而得到更加随机的数。

三、示例说明

3.1 示例一

在一个LCD显示屏上显示当前时间,并且使用定时器使其每隔一秒进行更新,示例代码如下:

#include <QtWidgets>

int main(int argc, char **argv)
{
    QApplication app(argc, argv);

    QLCDNumber *lcd = new QLCDNumber(8);
    lcd->setSegmentStyle(QLCDNumber::Filled);
    lcd->setWindowTitle("Digital Clock");
    lcd->show();

    QTimer *timer = new QTimer;
    QObject::connect(timer, &QTimer::timeout, [&lcd]() {
        lcd->display(QTime::currentTime().toString("hh:mm:ss"));
    });

    timer->start();

    return app.exec();
}

3.2 示例二

生成10个小球,随机设置它们的位置,并使用定时器对它们进行移动,示例代码如下:

#include <QtWidgets>

class Ball : public QWidget
{
public:
    Ball(QWidget *parent = nullptr) : QWidget(parent)
    {
        const auto red = qrand() % 256;
        const auto green = qrand() % 256;
        const auto blue = qrand() % 256;
        color_ = QColor(red, green, blue);

        int radius = qrand() % 50 + 10;
        resize(radius * 2, radius * 2);

        x_ = qrand() % (parent->width() - radius);
        y_ = qrand() % (parent->height() - radius);

        timer_ = new QTimer;
        connect(timer_, &QTimer::timeout, this, &Ball::move);
        timer_->start(qrand() % 20 + 5);
    }

    void paintEvent(QPaintEvent *)
    {
        QPainter painter(this);
        painter.setBrush(QBrush(color_));
        painter.drawEllipse(rect());
    }

    void move()
    {
        x_ += qrand() % 21 - 10;
        y_ += qrand() % 21 - 10;
        if (x_ < 0) x_ = 0;
        if (y_ < 0) y_ = 0;
        if (x_ + width() > parentWidget()->width()) x_ = parentWidget()->width() - width();
        if (y_ + height() > parentWidget()->height()) y_ = parentWidget()->height() - height();

        move(x_, y_);
    }

private:
    QTimer *timer_;
    QColor color_;
    int x_;
    int y_;
};

class Widget : public QWidget
{
public:
    Widget(QWidget *parent = nullptr) : QWidget(parent)
    {
        for (int i = 0; i < 10; ++i) {
            Ball *ball = new Ball(this);
            ball->move(qrand() % width(), qrand() % height());
            ball->show();
        }
    }
};

int main(int argc, char **argv)
{
    QApplication app(argc, argv);

    qsrand(QDateTime::currentMSecsSinceEpoch() / 1000);

    Widget widget;
    widget.show();

    return app.exec();
}

以上就是Qt定时器和随机数的详细攻略,希望对您有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Qt定时器和随机数详解 - Python技术站

(0)
上一篇 2023年6月26日
下一篇 2023年6月26日

相关文章

  • appium移动自动化测试之java篇

    Appium移动自动化测试之Java篇 什么是Appium Appium是一款开源的移动测试自动化工具,可以支持Android和iOS平台的原生、混合和Web应用程序的测试。 Appium的优点 跨平台支持 Appium可以同时支持不同操作系统平台上的不同设备,因此开发人员可以使用同一套测试脚本进行不同平台的移动应用程序测试。 支持多种编程语言 Appium…

    其他 2023年3月28日
    00
  • MySql约束超详细介绍

    MySql约束超详细介绍 在 MySQL 中,约束是用于强制实施数据完整性的规则。MySQL 的约束有多种类型,分别是主键、唯一、非空、默认和外键。下面将详细介绍这些类型的约束及其使用。 主键约束 主键约束是一组列或单列,其值标识表中每个记录的唯一性。创建主键会自动创建唯一索引,因此不允许在表中有重复值或NULL值。主键可由用户创建或由系统自动创建。 用户创…

    other 2023年6月25日
    00
  • 微信小程序开发手册

    当然,我可以为您提供详细的“微信小程序开发手册”的完整攻略,包括两个示例说明。 微信小程序开发手册的完整攻略 微信小程序是一种轻量级的应用程序,可以在微信中直接运行,无需下载安装。微信小程序开发使用的是微信官方提供的开发工具,开发语言为JavaScript。在本教程中,将介绍微信小程序开发的完整攻略,包括两个示例说明。 步骤 以下是微信小程序开发的步骤: 下…

    other 2023年5月7日
    00
  • 利用PHP_XLSXWriter代替PHPExcel的方法示例

    利用PHP_XLSXWriter代替PHPExcel的方法示例: 安装PHP_XLSXWriter库 PHP_XLSXWriter是一个PHP的类库,用于将数据写入Excel文件。可以通过Composer或手动下载源代码的方式安装。此处以使用Composer安装为例。 composer require makewebthings/phpxlsxwriter …

    other 2023年6月26日
    00
  • PHP内核探索之变量

    PHP内核探索之变量 本攻略将详细讲解PHP内核中关于变量的相关知识。我们将探索PHP内核是如何处理变量的创建、赋值、引用和销毁等操作。 变量的创建 在PHP内核中,变量的创建是通过zval结构体来实现的。zval结构体包含了变量的值和类型信息。 下面是一个示例代码,演示了如何在PHP内核中创建一个整数变量: zval my_var; ZVAL_LONG(&…

    other 2023年8月8日
    00
  • 个人总结的一些关于String、Function、Array的属性和用法

    个人总结的一些关于 String、Function、Array 的属性和用法 String 字符串是 JavaScript 中最常见的数据类型之一。以下是一些关于字符串的属性和用法: 长度 使用 length 属性可以获取字符串的长度。 const str = "hello world"; console.log(str.length);…

    other 2023年6月20日
    00
  • Centos8无法安装docker问题的解决方法

    以下是详细的CentOS 8安装Docker的攻略,包括两条示例说明: 问题描述 在CentOS 8中尝试安装Docker,可能会出现以下错误信息: Last metadata expiration check: 0:01:00 ago on Wed 05 May 2021 09:10:54 AM CST. No match for argument: do…

    other 2023年6月27日
    00
  • vector的几种初始化及赋值方式

    Vector的几种初始化及赋值方式 在C++中,vector是一个非常常用的容器,它可以动态地增加和减少元素,类似于数组,但是不需要提前预留空间,更加灵活方便。本文将介绍vector的几种初始化及赋值方法。 声明并初始化 当我们声明一个vector变量时,需要指定元素的数据类型,如: vector<int> vec; 此时vec是一个空的vect…

    其他 2023年3月28日
    00
合作推广
合作推广
分享本页
返回顶部