qt内部的特殊技巧【QT】

server/2025/1/31 14:25:36/

下面的代码实现一个进度条的功能:

代码一:
widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include<QTimer>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();
public slots:void  handle() ;
private:Ui::Widget *ui;QTimer * timer ;};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);timer = new QTimer(this) ;connect(timer ,&QTimer::timeout , this , &Widget::handle) ;timer->start(100) ;//设置定时器每100毫秒触发一次超时信号
}Widget::~Widget()
{delete ui;
}void Widget::handle()
{//获得进度条的当前数值int value = ui->progressBar->value();//进度条满了就停止定时器if(value>=100){timer->stop();return ;}ui->progressBar->setValue(value+1) ;}

代码二:

下面的代码实现一个进度条的功能:

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();
public slots:void  handle() ;
private:Ui::Widget *ui;QTimer * timer ;};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include<QTimer>
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);timer = new QTimer(this) ;connect(timer ,&QTimer::timeout , this , &Widget::handle) ;timer->start(100) ;//设置定时器每100毫秒触发一次超时信号
}Widget::~Widget()
{delete ui;
}void Widget::handle()
{//获得进度条的当前数值int value = ui->progressBar->value();//进度条满了就停止定时器if(value>=100){timer->stop();return ;}ui->progressBar->setValue(value+1) ;}

代码一的QTimer头文件放在了widget.h 中
代码二的QTimer头文件放在了widget.cpp 中
这两种代码均可编译

问题:代码二虽然在 widget.h 中用到了QTimer,但是却没在.h文件中包含QTimer 头文件,
为什么代码二编译不会出错?
为什么代码二的QTimer不会出现提示"找不到定义"之类的报错 ?

原因:

上述问题通过Qt内部提供的一个特殊技巧来实现的
在Qt中,有一个专门的头文件,这个头文件中包含了Qt中所有类的"前置声明"

前置声明
例如:

class QWidget ;
class QPushButton ;
class QTimer;
...

专门的头文件:
这个头文件,一般不会直接接触到,但是包含其他的Qt的头文件,都会间接的包含到这个头文件中

例如:代码二中 的widget.h包含了QWidget的头文件。

#include <QWidget>

但是QWidget这个头文件,间接包含了专门的头文件 , 专门的头文件中包含了QTimer的前置声明

class QTimer;

Widget类的前面已经提供了QTimer类的声名的话,此时就可以在Widget中声明QTimer的指针/引用类型的成员

后续如果要真正使用QTimer (包括创建实例,使用里面的成员.….)仍然需要包含QTimer的头文件(包含了QTimer 的详细的类的定义)


http://www.ppmy.cn/server/163813.html

相关文章

大数据k-means聚类算法:基于k-means聚类算法+NLP微博舆情数据爬虫可视化分析推荐系统

文章目录 一、项目概述二、项目说明三、研究意义四、系统总体架构设计总体框架技术架构 五、K-means聚类算法部分模块六、 snownlp情感分析功能模块七、数据采集模块数据采集模块功能实现 八、数据管理模块九、项目截图十、结语 一、项目概述 当代社会&#xff0c;微博等社交媒…

three.js用粒子使用canvas生成的中文字符位图材质

three.js用粒子使用canvas生成中文字符材质 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Three.…

深度学习|表示学习|卷积神经网络|输出维度公式如何理解?|16

如是我闻&#xff1a; 当我们对输入图像进行卷积时&#xff0c;输出的宽度和高度可以通过以下公式计算&#xff1a; 输出大小 输入大小 − 卷积核大小 2 ⋅ 填充大小 步长 1 \text{输出大小} \frac{\text{输入大小} - \text{卷积核大小} 2 \cdot \text{填充大小}}{\text{步…

31【api接口】

api接口大家可能听过&#xff0c;但是不知道具体是什么&#xff0c;本节将来为大家解答这个问题 我们在开发中可能会需要用到很多功能&#xff0c;但是我们不想或者能力上无法开发&#xff0c;如果这个功能需要的人比较多的话&#xff0c;便会有第3方去完成开发&#xff0c;我…

Day27-【13003】短文,什么是栈?栈为何用在递归调用中?顺序栈和链式栈是什么?

文章目录 第三章栈和队列总览第一节栈概览栈的定义及其基本操作如何定义栈和栈的操作&#xff1f;合理的出栈序列个数如何计算&#xff1f;栈的两种存储方式及其实现&#xff1f;顺序栈及其实现&#xff0c;还有对应时间复杂度*、清空栈&#xff0c;初始化栈5、栈空&#xff0c…

PDF 擦除工具

该软件仅仅适用于非人民币玩家&#xff0c;如果有wps会员等类似的软件的没有大用处 PDF Eraser允许用户擦除PDF文件中任何元素&#xff0c;并且支持添加文本和图像。除此之外PDF Eraser允许用户删除不必要的PDF页面&#xff0c;为了兼顾一些大型的扫描的PDF文档&#xff0c;PDF…

深度学习|表示学习|卷积神经网络|输出维度公式|15

如是我闻&#xff1a; 在卷积和池化操作中&#xff0c;计算输出维度的公式是关键&#xff0c;它们分别可以帮助我们计算卷积操作和池化操作后的输出大小。下面分别总结公式&#xff0c;并结合解释它们的意义&#xff1a; 1. 卷积操作的输出维度公式 当我们对输入图像进行卷积时…

2025年美赛数学建模B题管理可持续旅游

美国阿拉斯加的朱诺市拥有约 3 万人口&#xff0c;并在 2023 年以 1.6 人的收入增长 百万邮轮乘客&#xff0c;在最繁忙的日子里接待多达 7 艘大型游轮 大约 2 万名游客。 [1] 虽然这些游客为 在 3.75 亿美元的 [2] &#xff0c;他们还带来了有关过度拥挤的问题&#xff0c;…