QT入门
Qt和QtCreator
基本图像
我明白了,就是在QtCreator里,.pro里的QT += core gui一类的,决定把那些头文件啊一类的目录放到项目里,然后对于一个Widget项目来说,整个窗口实际上就是一个Widget对象,然后ui的那些东西,是通过这个Widget对象里private部分的ui指针来管理的。然后那些用于ui驱动的函数,就是叫作槽,是定义在private slots:的部分。
这里有一些关于C++本身的用法,需要我们去理解和体会:
1 | Widget::Widget(QWidget *parent) |
冒号:
后面的部分称为初始化列表,用于初始化成员变量。初始化列表的优点是,效率更高,直接初始化成员,而不是先调用默认构造函数然后再赋值。冒号后面分别是每一个成员变量,成员变量的括号里是要赋值给这个成员变量的值。
这里其实也可以看到吗,就是new
方法返回来的是一个对应对象的一个指针,所以这里都是用->
方法来调用对应对象的方法。
信号与槽机制
信号与槽机制用于对象间通信,它允许一个对象(信号的发出者)通知另一个对象(槽的接受者)某个对象的发生,比如在ui上点击了一个按钮之后,触发某个函数。信号(signal)是由对象在某些条件满足时发出的通知,槽(slot)是可以链接到信号的普通成员函数,当信号发出时会被调用。连接(connect)是将信号与槽绑定的操作,建立信号发出者与槽接收者之间的关系。代码中通过emit
关键字发出信号,但对于UI操作等比如点击按钮,其内部已经封装了信号发出等操作,我们只需要将connect
将信号与槽连接起来,不需要显式调用。
哦哦我知道了,就是说,clicked()
是一个信号,当我点击这个按钮的时候,这个按钮内部实现了一些代码,就是检测到按钮点击会调用emit clicked();
类似的代码以发出信号。所以我们需要使用connect
连接的并不是点击和槽函数,而是这个信号和槽函数。
connect
在Qt中接收4个参数。
第一个参数是信号的发出者,类型是指向QObject
的指针,比如一个按钮或者一个窗口部件。
第二个参数是信号,类型是指向信号函数的指针,表示发出信号的成员函数。
第三个参数是信号的接收者,类型是指向QObject
的指针,一般是this
。
第四个参数是槽函数,类型是指向槽函数的指针,表示接收信号的成员函数。
Qt的信号与槽机制也是可以传递参数的,信号可以给槽函数传递参数,而且槽函数可以接收的参数数目及类型完全由信号函数所决定。比如QNetworkAccessManager::finished
信号定义为:
1 | void finished(QNetworkReply* reply); |
它会向槽函数传递一个QNetworkReply*
的参数,在定义槽函数的时候也必须定义一个同样类型的位置参数。需要注意的就是参数类型必须严格匹配,比如如果信号传递的是QNetworkReply*
,而槽函数定义的参数是QString*
,那么就会导致链接失败。同样如果信号不传递参数,而槽函数定义了参数,那么Qt就会报错。而如果信号传递了多个参数,而槽函数只接受一部分参数,那么Qt是允许这种部分匹配的。例如:
1 | void finished(QNetworkReply* reply, int statusCode); // 信号定义 |
在这种情况下,reply
会被正常传递,但statusCode
会被忽略。
Qt网络编程
在Qt中,网络编程的基本框架分为几个主要模块,每个模块负责特定的功能。理解这些模块及其职责可以帮助你更轻松地开发网络相关程序。
QNetworkAccessManager
:网络请求管理模块,主要负责发送网络请求,是所有网络操作的核心接口。发起请求后,异步处理结果,通过信号与槽机制通知应用程序。
QNetworkRequest
:定义请求的详细信息,包括URL、头部信息、编码格式等,是网络请求的配置对象,所有请求都需要通过它来传递参数。
QNetworkReply
:表示服务器返回的响应数据,提供接口读取响应内容、状态码、错误信息等。
QJsonDocument
、QJsonObject
、QJsonArray
、QXmlStreamReader
:解析特定格式的数据等。
基本工作流程是,用户通过点击按钮输入URL并触发网络请求。应用程序调用QNetworkAccessManager
的方法发起请求,其中使用QNetworkRequest
配置请求URL和必要参数。QNetworkAccessManager
在请求完成后发出finished
信号,通过QNetworkReply
对象获取返回的数据或错误信息。如果响应结果为JSON等格式,可以使用Qt提供的解析工具再进行解析,最后再将解析结果显示在UI中。
1 | [用户界面] --> [QNetworkAccessManager] --> [QNetworkRequest] --> 服务器 |
一个简单例子是,用户输入一个URL,
- 界面通过
QLineEdit
获取输入。 - 按钮点击触发
QNetworkAccessManager
的get()
请求。 QNetworkReply
返回数据,检查是否有错误。- 如果是JSON数据,用
QJsonDocument
解析。 - 显示解析后的天气信息在
QLabel
上。
就是url这个QString要先封装成QUrl对象,然后用QUrl对象生成一个QNetworkRequest对象,然后调用networkManager的get方法,发送这个request,