Qt定时器和随机数详解

yizhihongxing

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日

相关文章

  • PHP 超级全局变量相关总结

    PHP 超级全局变量相关总结 在 PHP 中,超级全局变量是一类特殊的全局变量,它们在脚本的任何地方都可以访问,无需使用 global 关键字。下面是 PHP 中最常用的超级全局变量的总结: 1. $_GET $_GET 是一个关联数组,用于获取通过 URL 参数传递给当前脚本的值。它可以用于从 URL 中获取用户输入的数据。以下是一个示例: // URL:…

    other 2023年7月28日
    00
  • 计算机网络之IP地址和子网掩码的关系

    计算机网络之IP地址和子网掩码的关系 在计算机网络中,IP地址和子网掩码是两个重要的概念。IP地址用于标识网络中的设备,而子网掩码用于确定网络中的主机和子网的范围。理解它们之间的关系对于正确配置网络是至关重要的。 IP地址 IP地址是一个32位的二进制数,通常以点分十进制的形式表示。它由两部分组成:网络地址和主机地址。网络地址用于标识网络,而主机地址用于标识…

    other 2023年7月29日
    00
  • c#获取文件超大图标256*256(转)

    C#获取文件超大图标256*256(转) 在开发工程中,我们经常会需要获取文件的图标,以便在自定义的程序中进行显示。通常情况下,我们可以通过Shell32库中的SHGetFileInfo函数实现。但是在Windows Vista及以上操作系统中,系统引入了超大图标(256*256)的支持,而SHGetFileInfo无法获取超大图标。本文将介绍如何使用C#获…

    其他 2023年3月28日
    00
  • 微信公众号开发者账号该怎么申请?

    要申请微信公众号开发者账号,步骤如下: 1. 进入微信公众平台官网 在浏览器中输入 https://mp.weixin.qq.com 并进入微信公众平台官网。 2. 注册微信公众号开发者账号 在微信公众平台官网首页,点击“注册”,进入注册页面。填写邮箱、手机号等相关信息并进行人机验证,最后点击“注册”。 3. 登录微信公众号开发者账号 注册完成后,使用已注册…

    other 2023年6月26日
    00
  • Spring框架构造注入操作实战案例

    Spring框架构造注入操作实战案例攻略 简介 Spring框架是一个开源的Java应用程序框架,它提供了一种轻量级的解决方案来构建企业级应用程序。其中,构造注入是Spring框架中的一种依赖注入方式,通过构造函数来注入依赖对象。本攻略将详细介绍如何在Spring框架中使用构造注入,并提供两个示例说明。 步骤 步骤一:配置Spring环境 首先,确保你已经正…

    other 2023年8月6日
    00
  • 升级macOS Big Sur 差点丢了我多年的珍藏文件(夹)!!!

    升级macOS Big Sur 差点丢了我多年的珍藏文件(夹)!!! 升级macOS Big Sur可能会导致文件丢失或损坏,因此在升级之前需要备份重要的文件。本文将为您提供升级macOS Big Sur的完整攻略,包括备份文件、升级系统、恢复文件等内容。 备份文件 在升级macOS Big Sur之前,需要备份重要的文件。以下是备份文件的步骤: 打开Fin…

    other 2023年5月6日
    00
  • 你好,FFMPEG 可视化

    FFMPEG 可视化的完整攻略 FFMPEG 是一款广泛使用的音视频处理工具,可以用于音视频的转码、剪辑、合并等操作。本文将为您提供一份 FFMPEG 可视化的完整攻略,包括安装、配置和使用等方面的内容,同时提供两个示例说明。 安装 FFMPEG 的安装步骤如下: 下载 FFMPEG:从官方网站下载最新版本的 FFMPEG。 安装依赖:安装 FFMPEG 的…

    other 2023年5月5日
    00
  • IE在DOM操作有表单控件时的bug

    IE在DOM操作有表单控件时的bug,可能会导致表单控件的值无法正确更新或者在IE11以下的版本中出现运行时错误。这个bug的出现可能会影响到网页的正确性和稳定性,因此我们需要进行相应的处理。 下面是解决这个bug的攻略: 1. 使用合适的DOM操作方法 在使用DOM操作时,我们尽量避免直接操作表单控件,而是使用合适的DOM操作方法。具体来说,可以使用以下方…

    other 2023年6月26日
    00
合作推广
合作推广
分享本页
返回顶部