QT发送HTTP请求的最小Demo

最近在筹划一个开源项目,为了尽可能压榨服务器性能,所以部分代码使用C++编写。程序涉及到对外的HTTP请求,正好发现QT自带这方面的库,那就直接引用吧!

下面给出一个最小的Demo,不做额外介绍,每个类的具体用法请查阅官方文档。

注意

跑Demo前需要在.pro文件中加上如下代码,以链接网络库。

QT += network

Demo:

#include <QCoreApplication>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QNetworkAccessManager>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    // 构建及发送请求
    QNetworkAccessManager *manager = new QNetworkAccessManager();
    QString url = "https://www.ibadboy.net";
    QNetworkRequest request;
    request.setUrl(QUrl(url));
    QNetworkReply *pReply = manager->get(request);

    // 开启一个局部的事件循环,等待页面响应结束
    QEventLoop eventLoop;
    QObject::connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit);
    eventLoop.exec();

    // 获取网页Body中的内容
    QByteArray bytes = pReply->readAll();
    qDebug() << bytes;

    return a.exec();
}

QT快速学习笔记——介绍窗体

QT中的窗体

在上一节中,我允诺会在本节介绍一个空白组件来作为窗体的“衬底”,也就是所有其他组件的父组件。

这个空白的组件的名字是QWidget,我不知道上一节中我贴出来的QT中类的结构简图你有没有仔细看。假如仔细看过应该会记得QPushButton以及其他所有的可视的窗体组件都是继承自QWidget的。

这应该很好理解,QWidget是所有可视组件的基类,拥有一个组件的基本属性——可以设置尺寸、设置标题、设置是否允许最大化及最小化等。

是不是被我说晕了?潜意识里认定明明只有窗体才拥有标题以及最大最小化这些按钮,为什么组件也可以?

这是因为在QT中其实并没有严格意义上的“窗体”,前面两节中咱们运行的程序展现出的窗体实际上都是组件本身——当一个不存在父组件的组件被调用show方法时,他就会显示出窗体的外边框。

下图是上一节中编写的程序,他的窗体外边框(标红部分)来自不存在父组件的button1对象,而button2对象的父组件是button1,所以button2的窗体外边框被隐藏了。

简而言之,QWidget拥有一个组件的基本能力,同时他默认不显示任何内容也不提供任何功能。

虽然QT中没有专门作为窗体的东西,但我们完全可以把QWidget这个组件当成纯粹的窗体来使用。

改进上一节的程序

非常简单,我们只需要把button1对象换成一个来自QWidget类的对象就好啦!

#include <QApplication>
#include <QPushButton>
#include <QWidget> // 引入QWidget组件

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    // 实例化一个QWidget对象window
    QWidget *window = new QWidget();
    // 注意这里将button2的父组件修改为window
    QPushButton *button2 = new QPushButton("Hi", window);

    // 这里修改要显示的组件为window
    window->show();

    return a.exec();
}

运行程序

还是很简陋,但是比上一节中那个两个按钮叠罗汉的程序可是好多了哈~

下一节中我将介绍QT组件的方法和属性,那时我们就可以利用新学的知识再度美化一下界面了。

QT快速学习笔记——在组件之上显示另一个组件

Parenting system介绍

这是我要介绍的QT程序的第一个重要的概念——Parenting system,原谅我不知道怎么翻译=_=。

这个机制的实现由QObject类提供,该类是QT中绝大部分组件的基类。QT中类的关系简图如下:

可以看到,我们在上一节中所使用的QPushButton组件也继承自QObject类,所以该组件也支持Parenting system机制。

代码演示

接下来我将通过一段代码来演示Parenting system机制的作用:

#include <QApplication>
#include <QPushButton>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QPushButton *button1 = new QPushButton("Hello World");
    // 实例化button2,在构造函数的第二个参数中填入button1的地址
    // 此时button2就是button1的子组件
    QPushButton *button2 = new QPushButton("Hi", button1);

    // 只需要显示父组件,其下的子组件就会一同显示
    // 另外子组件也不需要单独调用delete(),他会随着父组件一起被释放
    button1->show();

    return a.exec();
}

运行后显示是这样的:

我们将窗体拉大,变成如下:

解读

可以看到,button2是显示在了button1的上面。这就很实际了,因为我们常见的Windows窗体都是在一个组件上叠加其他组件来显示的,例如:

每一个颜色的框框代表一个组件(没有把所有组件都标记出来,只摘取部分说明问题)。可以发现这样一个很复杂的窗体,就是一个面积很大的组件上面无限层次的叠加小组件来最终实现的。

而维护这种组件之间的父子关系的方法就是我们本篇文章所介绍的——Parenting system机制。

但是我们刚刚的程序还存在一个问题,就是父组件button1是一个按钮,试想一下如果把button1换成一个显示空白的组件是不是会更好一些?相关内容将在下一篇文章中详述。

QT快速学习笔记——编写第一个QT程序

刚新建完的QT项目包含五个文件,分别是:

  • main.cpp
  • mainwindow.cpp
  • mainwindow.h
  • mainwindow.ui
  • untitled.pro

尝试运行一下这个默认项目,运行的方法如下所示。

运行起来的程序:

是一个标题为MainWindow的空窗体,里面什么也没有。即便如此,这个窗体的代码对于初学者而言依然过于复杂,接下来我们删除掉窗体显示相关代码,只保留QT程序最基本的框架,随后再一点一点向里面填充内容。

删掉除了main.cpp和untitled.pro之外的其他文件。最后整个项目变成这样:

我们看main.cpp,这个文件的初始内容如下:

#include "mainwindow.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}

下面简单修改一下这个文件,删除掉对mainwindow.h文件的引用和对MainWindow类的实例化相关代码。我们在之前看到的那个标题为MainWindow的窗体实际上就是这个类生成的。删除后的代码如下所示:

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    
    return a.exec();
}

现在看到的就是一个QT程序的最基本框架了。下面我们填充一个按钮到这个QT程序里,让按钮显示Hello World。

#include <QApplication>
#include <QPushButton> // QPushButton这个类提供按钮组件

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    // 实例化一个按钮,这里传给构造函数的值会被设置为按钮显示的文字
    // 除此之外还可以通过按钮类提供的setText方法来设置,后面会讲
    QPushButton *button = new QPushButton("Hello World"); 
    button->show(); // 调用show方法,显示组件。

    return a.exec();
}

之后运行程序就可以看到第一个QT程序跑起来了~他可能很简陋,但战略意义远大于战术意义。

QT快速学习笔记——开发环境部署及项目创建

QT开发环境安装

在下面的地址中找到适合你的操作系统的最新的安装包,下载之。

http://download.qt.io/archive/qt/

安装步骤就是一路点击“下一步”,直到出现如下界面的时候需要手工勾选一下,只勾选我标记出来的选项即可。

随后继续下一步,直到安装完成。

创建一个新项目

QT自带的开发工具叫QT Creator,是一个C++ IDE,你也可以使用微软的VS来开发QT,这里只介绍QT Creator。

QT安装好后QT Creator的快捷方式并不会创建在系统桌面上,需要你去开始菜单里找。

QT Creator启动后长这个样子:

创建项目的流程是:文件->新建文件或项目,然后调出如下界面,按照我选的选一下,之后一路无脑下一步。选的过程中可以简单看看界面的文字介绍了解一下这一步大概做了哪些工作,实在搞不懂的也别去纠结,该懂的以后自然会懂~

这样一个QT项目就创建好了,如下所示:

QT快速学习笔记——导语

前言

为什么称之为“快速学习笔记”?是因为我本人学东西就是一个“莽”字,啥也不会的时候就横冲直撞观其大略习其思想,瞅的差不多了直接融入到项目里应用,再在开发过程中对细节问题随时查缺补漏。当然这种学习方法并不适合所有人,有的自律性强耐得住寂寞的人就比较喜欢稳扎稳打,从基础开始一点点学。

哦,对了——你可能想问学习QT是不是要精通C++才行?我必须告诉你并不是,因为我本人就是个C++白痴(约等于什么也不会的那种),按照我的学习思路,C++的语法是到用到的时候才会去查手册的,并不会在学习QT时提前去学。当然,这样做的前提是,你必须拥有其他至少一门OOP编程语言的使用经验,否则还是先简单学习下C++再来看这个系列的文章吧。

QT简介

QT是一个C++的开发库,里面包括多线程、网络、GUI等等的模块。很多人把QT当成是一个GUI库其实是片面了,因为QT更像一个大杂烩,GUI只是其功能的一部分。

QT学习资料

除了本系列文章之外你还可以参考官方的学习手册。其实我是很推荐你看看官方手册的,因为我所写的是我按照我的理解方式总结出来的,也许你自己翻一遍官方手册会有不一样的感悟呢。英文不好没关系,我也是借着谷歌翻译看的=_=

QT官方入门手册(推荐初学者阅读)

https://wiki.qt.io/Qt_for_Beginners

QT官方完全开发手册(推荐做项目的时候随用随查)

https://doc.qt.io/qt-5/reference-overview.html

QT的应用案例

列举四个比较有名的项目

  • 国产Deepin操作系统的DDE桌面环境
  • KDE桌面环境
  • WPS办公软件
  • HBuilderX前端开发者工具