欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 资讯 > qt内部的特殊技巧【QT】

qt内部的特殊技巧【QT】

2025/2/3 6:47:13 来源:https://blog.csdn.net/qq_73478334/article/details/145399216  浏览:    关键词:qt内部的特殊技巧【QT】

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

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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com