QT入门

Qt和QtCreator

基本图像

我明白了,就是在QtCreator里,.pro里的QT += core gui一类的,决定把那些头文件啊一类的目录放到项目里,然后对于一个Widget项目来说,整个窗口实际上就是一个Widget对象,然后ui的那些东西,是通过这个Widget对象里private部分的ui指针来管理的。然后那些用于ui驱动的函数,就是叫作槽,是定义在private slots:的部分。

这里有一些关于C++本身的用法,需要我们去理解和体会:

1
2
3
4
5
6
7
Widget::Widget(QWidget *parent)
: QWidget(parent) // 调用父类 QWidget 的构造函数,初始化 parent
, ui(new Ui::Widget) // 分配内存,初始化 ui 指针
, networkManager(new QNetworkAccessManager(this)) // 初始化 networkManager
{
ui->setupUi(this); // 配置 UI 的控件
}

冒号:后面的部分称为初始化列表,用于初始化成员变量。初始化列表的优点是,效率更高,直接初始化成员,而不是先调用默认构造函数然后再赋值。冒号后面分别是每一个成员变量,成员变量的括号里是要赋值给这个成员变量的值。

这里其实也可以看到吗,就是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
2
void finished(QNetworkReply* reply, int statusCode); // 信号定义
void onReplyFinished(QNetworkReply* reply); // 槽函数

在这种情况下,reply会被正常传递,但statusCode会被忽略。

Qt网络编程

在Qt中,网络编程的基本框架分为几个主要模块,每个模块负责特定的功能。理解这些模块及其职责可以帮助你更轻松地开发网络相关程序。

QNetworkAccessManager:网络请求管理模块,主要负责发送网络请求,是所有网络操作的核心接口。发起请求后,异步处理结果,通过信号与槽机制通知应用程序。

QNetworkRequest:定义请求的详细信息,包括URL、头部信息、编码格式等,是网络请求的配置对象,所有请求都需要通过它来传递参数。

QNetworkReply:表示服务器返回的响应数据,提供接口读取响应内容、状态码、错误信息等。

QJsonDocumentQJsonObjectQJsonArrayQXmlStreamReader:解析特定格式的数据等。

基本工作流程是,用户通过点击按钮输入URL并触发网络请求。应用程序调用QNetworkAccessManager的方法发起请求,其中使用QNetworkRequest配置请求URL和必要参数。QNetworkAccessManager在请求完成后发出finished信号,通过QNetworkReply对象获取返回的数据或错误信息。如果响应结果为JSON等格式,可以使用Qt提供的解析工具再进行解析,最后再将解析结果显示在UI中。

1
2
3
4
5
[用户界面] --> [QNetworkAccessManager] --> [QNetworkRequest] --> 服务器

[QNetworkReply]

[数据解析模块] --> [用户界面]

一个简单例子是,用户输入一个URL,

  1. 界面通过QLineEdit获取输入。
  2. 按钮点击触发QNetworkAccessManagerget()请求。
  3. QNetworkReply返回数据,检查是否有错误。
  4. 如果是JSON数据,用QJsonDocument解析。
  5. 显示解析后的天气信息在QLabel上。

就是url这个QString要先封装成QUrl对象,然后用QUrl对象生成一个QNetworkRequest对象,然后调用networkManager的get方法,发送这个request,