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前端開發者工具