114.QTimer类和QWidget类

news2024/9/25 23:14:48

目录

一、QTimer类

定时器使用举例:

二、QWidget类 

2.1设置父对象

2.2窗口位置

2.3窗口尺寸

2.4窗口标题和图标

2.5信号

2.6槽函数

示例代码:


一、QTimer类

   QTimer 是 Qt 中用于实现定时器的类。它可以在一定的时间间隔内发射信号,用于执行一些特定的操作。要使用它,只需创建一个QTimer类对象,然后调用其 start() 函数开启定时器,此后QTimer对象就会周期性的发出 timeout() 信号。我们先来了解一下这个类的相关API。

// 构造函数
// 如果指定了父对象, 创建的堆内存可以自动析构
QTimer::QTimer(QObject *parent = nullptr);

// 设置定时器时间间隔为 msec 毫秒
// 默认值是0,一旦窗口系统事件队列中的所有事件都已经被处理完,一个时间间隔为0的QTimer就会触发
void QTimer::setInterval(int msec);
// 获取定时器的时间间隔, 返回值单位: 毫秒
int QTimer::interval() const;

// 根据指定的时间间隔启动或者重启定时器, 需要调用 setInterval() 设置时间间隔
[slot] void QTimer::start();
// 启动或重新启动定时器,超时间隔为msec毫秒。
[slot] void QTimer::start(int msec);
// 停止定时器。
[slot] void QTimer::stop();

// 设置定时器精度
/*
参数: 
    - Qt::PreciseTimer -> 精确的精度, 毫秒级
    - Qt::CoarseTimer  -> 粗糙的精度, 和1毫秒的误差在5%的范围内, 默认精度
    - Qt::VeryCoarseTimer -> 非常粗糙的精度, 精度在1秒左右
*/
void QTimer::setTimerType(Qt::TimerType atype);
Qt::TimerType QTimer::timerType() const;	// 获取当前定时器的精度

// 如果定时器正在运行,返回true; 否则返回false。
bool QTimer::isActive() const;

// 判断定时器是否只触发一次
bool QTimer::isSingleShot() const;
// 设置定时器是否只触发一次, 参数为true定时器只触发一次, 为false定时器重复触发, 默认为false
void QTimer::setSingleShot(bool singleShot);

定时器使用举例:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QTimer>
#include <QTime>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    //创建定时器对象
    QTimer* timer=new QTimer(this);

    //修改定时器对象的精度
    timer->setTimerType(Qt::PreciseTimer);

    //按钮点击事件
    connect(ui->loopBtn,&QPushButton::clicked,this,[=]()
    {
        //启动定时器
        if(timer->isActive())
        {
            timer->stop();//关闭定时器
            ui->loopBtn->setText("开始");
        }
        else
        {
            ui->loopBtn->setText("关闭");
            timer->start(1000);//1000ms=1s
        }
    });

    connect(timer,&QTimer::timeout,this,[=]()
    {
        QTime tm=QTime::currentTime();
        //格式化当前得到的系统时间
        QString tmstr=tm.toString("hh:mm:ss.zzz");
        //设置要显示的时间
        ui->curTime->setText(tmstr);
    });

    //发射一次信号
    connect(ui->onceBtn,&QPushButton::clicked,this,[=]()
    {
        //获取2s以后的系统时间
        QTimer::singleShot(2000,this,[=](){
        QTime tm=QTime::currentTime();
        //格式化当前得到的系统时间
        QString tmstr=tm.toString("hh:mm:ss.zzz");
        //设置要显示的时间
        ui->onceTime->setText(tmstr);
        });
    });
}

MainWindow::~MainWindow()
{
    delete ui;
}

这段代码创建了一个简单的Qt窗口应用程序,其中包含了两个按钮("开始"和"关闭"按钮,分别由ui->loopBtn表示),以及两个标签(ui->curTimeui->onceTime表示当前时间和一次性定时器的时间)。这个应用程序使用了QTimer类来实现定时功能。

下面是代码的主要功能和流程:

  1. 创建了一个 QTimer 对象 timer,并设置了其精度为 Qt::PreciseTimer
  2. 通过 lambda 表达式连接 "开始"/"关闭" 按钮的点击事件,以实现定时器的启动和停止。
  3. 连接 timertimeout 信号到 lambda 表达式,每次定时器超时时更新当前时间标签 ui->curTime
  4. 连接 "一次性" 按钮的点击事件,使用 QTimer::singleShot 实现一次性的定时器,延迟2秒后更新一次 ui->onceTime 标签。

这个应用程序演示了 QTimer 的基本用法,用于处理定时事件和一次性定时操作。当用户点击 "开始" 按钮时,定时器启动,每秒更新一次当前时间。点击 "一次性" 按钮时,延迟2秒后更新一次一次性时间。点击 "关闭" 按钮时,定时器停止。

需要确保在 Qt 项目中添加了 QTimer 头文件的引用。这段代码在构造函数中完成了信号和槽的连接,并在析构函数中释放了 ui 对象。

二、QWidget类 

        QWidget类是所有窗口类的父类(控件类是也属于窗口类), 并且QWidget类的父类的QObject, 也就意味着所有的窗口类对象只要指定了父对象, 都可以实现内存资源的自动回收。

2.1设置父对象

// 构造函数
QWidget::QWidget(QWidget *parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags());

// 公共成员函数
// 给当前窗口设置父对象
void QWidget::setParent(QWidget *parent);
void QWidget::setParent(QWidget *parent, Qt::WindowFlags f);
// 获取当前窗口的父对象, 没有父对象返回 nullptr
QWidget *QWidget::parentWidget() const;

2.2窗口位置

//------------- 窗口位置 -------------
// 得到相对于当前窗口父窗口的几何信息, 边框也被计算在内
QRect QWidget::frameGeometry() const;
// 得到相对于当前窗口父窗口的几何信息, 不包括边框
const QRect &geometry() const;
// 设置当前窗口的几何信息(位置和尺寸信息), 不包括边框
void setGeometry(int x, int y, int w, int h);
void setGeometry(const QRect &);
    
// 移动窗口, 重新设置窗口的位置
void move(int x, int y);
void move(const QPoint &);

2.3窗口尺寸

//------------- 窗口尺寸 -------------
// 获取当前窗口的尺寸信息
QSize size() const
// 重新设置窗口的尺寸信息
void resize(int w, int h);
void resize(const QSize &);
// 获取当前窗口的最大尺寸信息
QSize maximumSize() const;
// 获取当前窗口的最小尺寸信息
QSize minimumSize() const;
// 设置当前窗口固定的尺寸信息
void QWidget::setFixedSize(const QSize &s);
void QWidget::setFixedSize(int w, int h);
// 设置当前窗口的最大尺寸信息
void setMaximumSize(const QSize &);
void setMaximumSize(int maxw, int maxh);
// 设置当前窗口的最小尺寸信息
void setMinimumSize(const QSize &);
void setMinimumSize(int minw, int minh);


// 获取当前窗口的高度    
int height() const;
// 获取当前窗口的最小高度
int minimumHeight() const;
// 获取当前窗口的最大高度
int maximumHeight() const;
// 给窗口设置固定的高度
void QWidget::setFixedHeight(int h);
// 给窗口设置最大高度
void setMaximumHeight(int maxh);
// 给窗口设置最小高度
void setMinimumHeight(int minh);

// 获取当前窗口的宽度
int width() const;
// 获取当前窗口的最小宽度
int minimumWidth() const;
// 获取当前窗口的最大宽度
int maximumWidth() const;
// 给窗口设置固定宽度
void QWidget::setFixedWidth(int w);
// 给窗口设置最大宽度
void setMaximumWidth(int maxw);
// 给窗口设置最小宽度
void setMinimumWidth(int minw);

2.4窗口标题和图标

//------------- 窗口图标 -------------
// 得到当前窗口的图标
QIcon windowIcon() const;
// 构造图标对象, 参数为图片的路径
QIcon::QIcon(const QString &fileName);
// 设置当前窗口的图标
void setWindowIcon(const QIcon &icon);

//------------- 窗口标题 -------------
// 得到当前窗口的标题
QString windowTitle() const;
// 设置当前窗口的标题
void setWindowTitle(const QString &);

2.5信号

// QWidget::setContextMenuPolicy(Qt::ContextMenuPolicy policy);
// 窗口的右键菜单策略 contextMenuPolicy() 参数设置为 Qt::CustomContextMenu, 按下鼠标右键发射该信号
[signal] void QWidget::customContextMenuRequested(const QPoint &pos);
// 窗口图标发生变化, 发射此信号
[signal] void QWidget::windowIconChanged(const QIcon &icon);
// 窗口标题发生变化, 发射此信号
[signal] void QWidget::windowTitleChanged(const QString &title);

2.6槽函数

//------------- 窗口显示 -------------
// 关闭当前窗口
[slot] bool QWidget::close();
// 隐藏当前窗口
[slot] void QWidget::hide();
// 显示当前创建以及其子窗口
[slot] void QWidget::show();
// 全屏显示当前窗口, 只对windows有效
[slot] void QWidget::showFullScreen();
// 窗口最大化显示, 只对windows有效
[slot] void QWidget::showMaximized();
// 窗口最小化显示, 只对windows有效
[slot] void QWidget::showMinimized();
// 将窗口回复为最大化/最小化之前的状态, 只对windows有效
[slot] void QWidget::showNormal();

//------------- 窗口状态 -------------
// 判断窗口是否可用
bool QWidget::isEnabled() const; // 非槽函数
// 设置窗口是否可用, 不可用窗口无法接收和处理窗口事件
// 参数true->可用, false->不可用
[slot] void QWidget::setEnabled(bool);
// 设置窗口是否可用, 不可用窗口无法接收和处理窗口事件
// 参数true->不可用, false->可用
[slot] void QWidget::setDisabled(bool disable);
// 设置窗口是否可见, 参数为true->可见, false->不可见
[slot] virtual void QWidget::setVisible(bool visible);

示例代码:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    //设置窗口的最大尺寸
    //setMaximumSize(600,600);
    //设置窗口的最小尺寸
    //setMinimumSize(300,300);
    //设置窗口的固定尺寸
    //setFixedSize(500,500);
    //设置窗口标题
    setWindowTitle("xinwei");
    //给显示的窗口设置图标
    setWindowIcon(QIcon("D:\\我的简历\\微信图片_20240112145734.jpg"));

    connect(this,&MainWindow::windowTitleChanged,this,[=](const QString &title)
    {
        qDebug()<<"新的标题:"<<title;
    });

    connect(this,&MainWindow::windowIconChanged,this,[=](const QIcon &icon)
    {
    qDebug()<<"当前窗口的图标被修改了";
    });

    setContextMenuPolicy(Qt::CustomContextMenu);
    connect(this,&MainWindow::customContextMenuRequested,this,[=](const QPoint &pos)
    {
        QMenu meun;
        meun.addAction("西红柿");
        meun.addAction("黄瓜");
        meun.addAction("西瓜");
        meun.exec(QCursor::pos());
    });
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_moveButt_clicked()
{
    QRect rect=this->frameGeometry();
    move(rect.topLeft()+QPoint(10,20));
}


void MainWindow::on_positionBut_clicked()
{
    QRect rect=this->frameGeometry();
    qDebug()<<"左上角:"<<rect.topLeft();
    qDebug()<<"右上角:"<<rect.topRight();
    qDebug()<<"左下角:"<<rect.bottomLeft();
    qDebug()<<"右下角:"<<rect.bottomRight();
    qDebug()<<"宽度:"<<rect.width();
    qDebug()<<"高度:"<<rect.height();
}


void MainWindow::on_geomeryBto_clicked()
{
    int x=100+rand()%500;
    int y=100+rand()%500;
    int width=this->width()+10;
    int height=this->height()+10;
    setGeometry(x,y,width,height);
}


void MainWindow::on_motiButton_clicked()
{
    setWindowTitle("你好,世界");
    setWindowIcon(QIcon("D:\\我的简历\\微信图片_20240112145725.jpg"));
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1380085.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【小程序开发需要多少钱?】

哈喽&#xff0c;大家好&#xff0c;这里是智创开发。 我们今天聊聊开发一个小程序需要多少钱。 由于自己组建团队来开发小程序成本过高&#xff0c;大品牌的企业一般都不会这么搞&#xff0c;所以我们今天只谈假如我有需求&#xff0c;找服务商来全程搞定的费用大致是多少。和…

Flutter之运行错误:this and base files have different roots

运行时报错&#xff1a; this and base files have different roots: E:\Demolpro\waqu\build\flutter-plugin-_android_lifecycle and C:\Users\78535\AppData\Local\Pub\Cache\hosted\pub.dev\flutter_pulgin_android_lifecycle-2.0.17\android 如图&#xff1a; 这种情况…

半导体抛光用PFA容量瓶耐强酸碱定容瓶

PFA容量瓶又称可溶性聚四氟乙烯容量瓶、特氟龙容量瓶容量瓶&#xff0c;我司新推出螺纹和插口两种可供选择&#xff0c;目前有10ml、25ml、50ml、100ml、250ml、500ml、1000ml的规格可提供&#xff0c;产品质量有保障。 Teflon系列PFA容量瓶是一个透明的长颈瓶&#xff0c;瓶体…

水果音乐编曲软件 FL Studio v21.2.2.3914 中文免费版(附中文设置教程)

FL studio21中文别名水果编曲软件&#xff0c;是一款全能的音乐制作软件&#xff0c;包括编曲、录音、剪辑和混音等诸多功能&#xff0c;让你的电脑编程一个全能的录音室&#xff0c;它为您提供了一个集成的开发环境&#xff0c;使用起来非常简单有效&#xff0c;您的工作会变得…

公司运营数据分析大屏:引领企业决策,驱动业务增长

在数字化时代&#xff0c;数据已经成为企业决策的关键。为了更好地洞察市场趋势、优化业务流程、提升运营效率&#xff0c;越来越多的企业开始引入数据分析大屏以分析公司运营状况。这一创新举措不仅改变了传统的管理模式&#xff0c;更引领企业迈向智能化决策的新篇章。 公司运…

Spring之AOP源码(二)

书接上文 文章目录 一、简介1. 前文回顾2. 知识点补充 二、ProxyFactory源码分析1. ProxyFactory2. JdkDynamicAopProxy3. ObjenesisCglibAopProxy 三、 Spring AOP源码分析 一、简介 1. 前文回顾 前面我们已经介绍了AOP的基本使用方法以及基本原理&#xff0c;但是还没有涉…

在Linux下配置Apache HTTP服务器

在Linux的世界里&#xff0c;如果说有什么比解决各种“神秘”的故障更让人头疼&#xff0c;那一定就是配置Apache HTTP服务器了。这不是因为Apache有什么问题&#xff0c;而是因为配置它简直就像解谜游戏&#xff0c;一不留神就会让你陷入无尽的纠结。 首先&#xff0c;你需要…

Maya参考图的导入和层的应用

参考视频&#xff1a;08.参考图的导入和层的应用_哔哩哔哩_bilibili 前视图/右视图模式下导入图形 创建图层 锁定后可以避免图片位置的移动 前视图和右视图要根据参照物对齐 与模型保持一定距离&#xff0c;同时把该参照图添加到图层中 模型可以添加到图层2中

瑞吉外卖笔记系列(2) —— 完善员工的后台系统登录功能,实现员工信息管理

本文档主要 完善员工的后台系统登录功能&#xff0c;新增员工&#xff0c;员工信息分页查询&#xff0c;启用/禁用员工账号&#xff0c;编辑员工信息 一、完善后台系统登录功能 1.1 问题分析 目前存在的问题是&#xff1a;理论上&#xff0c;用户必须在 http://localhost:808…

LeetCode 590. N 叉树的后序遍历

590. N 叉树的后序遍历 给定一个 n 叉树的根节点 root &#xff0c;返回 其节点值的 后序遍历 。 n 叉树 在输入中按层序遍历进行序列化表示&#xff0c;每组子节点由空值 null 分隔&#xff08;请参见示例&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [1,null,…

数据结构与算法:插入排序希尔排序

数据结构与算法&#xff1a;插入排序&希尔排序 插入排序希尔排序 插入排序 假设现在你有一个有序的数组&#xff0c;你要把一个数据插入到数组中&#xff0c;保证插入后依然有序&#xff0c;要怎么做&#xff1f; 对于人来说&#xff0c;这个问题就像是在整理扑克牌&…

优化 - 重构一次Mysql导致服务器的OOM

概述 优化了一次前后端处理不当导致的CPU的一次爆机行为&#xff0c;当然&#xff0c;这和服务器的配置低也有着密不可分的关系&#xff0c;简单的逻辑学告诉我们&#xff0c;要找到真正的问题&#xff0c;进行解决&#xff0c;CPU爆机的关键点在于前后端两个方面&#xff0c;…

在CentOS中,对静态HTTP服务的性能监控

在CentOS中&#xff0c;对静态HTTP服务的性能监控和日志管理是确保系统稳定运行和及时发现潜在问题的关键。以下是对这一主题的详细探讨。 性能监控 使用工具监控&#xff1a;top、htop、vmstat、iostat等工具可以用来监控CPU、内存、磁盘I/O等关键性能指标。这些工具可以实时…

Linux中常使用的命令之ls、cd、pwd、mkdir、rmdir

ls: 列出目录 cd&#xff1a;切换目录 pwd&#xff1a;显示目前的目录 mkdir&#xff1a;创建一个新的目录 -m &#xff1a;配置文件的权限-p &#xff1a;帮助你直接将所需要的目录(包含上一级目录)递归创建起来&#xff01; rmdir&#xff1a;删除一个空的目录 注意这…

RK3568驱动指南|第十二篇 GPIO子系统-第130章 GPIO的调试方法

瑞芯微RK3568芯片是一款定位中高端的通用型SOC&#xff0c;采用22nm制程工艺&#xff0c;搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码&#xff0c;支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU&#xff0c;可用于轻量级人工…

maya显示方式及视图操作

原始图像&#xff1a; 按数字键2后&#xff08;平滑效果&#xff09;&#xff1a; 按数字键3后&#xff08;平滑效果&#xff0c;无原始外边框&#xff09;&#xff1a; 按数字键4后&#xff08;仅显示边框&#xff09;&#xff1a; 方便选择后面的点、线及面 按数字键5后&…

Pytest测试 —— 如何使用属性来标记测试函数!

在软件开发领域&#xff0c;单元测试是确保代码质量和可维护性的关键一环。随着项目的不断发展&#xff0c;测试用例的管理变得愈发复杂&#xff0c;而一些测试可能需要特殊的处理、环境或者标记。在Python中&#xff0c;我们可以通过使用属性&#xff08;Attribute&#xff09…

大语言模型向量数据库

大语言模型&向量数据库 LARGE LANGUAGE MODELSA. Vector Database & LLM WorkflowB. Vector Database for LLMC. Potential Applications for Vector Database on LLMD. Potential Applications for LLM on Vector DatabaseE. Retrieval-Based LLMF. Synergized Exampl…

解决ELK日志收集中Logstash报错的关键步

ElK执行日志收集的时候logstash报错&#xff1a; Failed to execute action {:action>LogStash::PipelineAction::Create/pipeline_id:main, :exception>“LogStash::ConfigurationError”, :message>“Expected one of [^\r\n], “\r”, “\n” at line 88, column 4…

BikeDNA(九) 特征匹配

BikeDNA&#xff08;九&#xff09; 特征匹配 特征匹配采用参考数据并尝试识别 OSM 数据集中的相应特征。 特征匹配是比较单个特征而不是研究区域网格单元水平上的特征特征的必要前提。 方法 将两个道路数据集中的特征与其数字化特征的方式以及边缘之间潜在的一对多关系进行…