当前位置: 首页 > article >正文

qt内部的特殊技巧【QT】

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

代码一:
widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include<QTimer>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    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_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    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 的详细的类的定义)

原文地址:https://blog.csdn.net/qq_73478334/article/details/145399216
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.kler.cn/a/526046.html

相关文章:

  • Python 梯度下降法(二):RMSProp Optimize
  • 2022 年 6 月大学英语四级考试真题(第 2 套)——纯享题目版
  • Big Bird:适用于更长序列的Transformer模型
  • Android 启动流程
  • 新版231普通阿里滑块 自动化和逆向实现 分析
  • 【25考研】考研366是否能进北航计算机复试?该怎么准备?
  • Ubuntu全面卸载mysql
  • unity使用内置videoplayer打包到安卓手机进行视频播放
  • linux asio网络编程理论及实现
  • 8.线程的同步和互斥
  • 大数据相关职位介绍之三(数据挖掘,数据安全 ,数据合规师,首席数据官,数据科学家 )
  • 解析静态链接
  • 我的毕设之路:(2)系统类型的论文写法
  • C++并发编程指南07
  • CMAKE工程编译好后自动把可执行文件传输到远程开发板
  • 深度学习探索:ChatGPT数据分析精髓 梯度下降优化方法深度剖析
  • 微软官方工具箱 PowerToys,提升工作效率
  • Conditional DETR for Fast Training Convergence论文学习
  • 负荷预测算法模型
  • 新月智能护甲系统CMIA--未来战场的守护者