Qt學習之網絡編程(一)


一些說明

學了有一段時間的python了,小項目做了不少,最近由於項目需要,所以要回歸老本行了,開始重點突擊C++和qt。python的網絡爬蟲系列有時間就更吧。

獲取本機網絡信息

在網絡應用中,經常需要用到本機的主機名、IP地址、MAC地址等網絡信息,通常通過調出命令行窗口輸入ipconfig(Windows)或者ifconfig(Linux)就可以查看相關信息了,在這里我們利用qt作出一個可以查詢的界面和功能出來,為了后面的網絡編程打下一個簡單的基礎。

創建界面

創建一個Qt Widget項目,生成相關代碼如下圖:
01.png
然后我們開始編寫頭文件,在Qt里頭文件的用處是申明相關函數。

#ifndef NETWORK2_H
#define NETWORK2_H

#include <QWidget>
#include <QLabel>
#include <QPushButton>
#include <QLineEdit>
#include <QGridLayout>
#include <QMessageBox>

class Network2 : public QWidget
{
    Q_OBJECT

public:
    Network2(QWidget *parent = 0);
    ~Network2();   //析構函數
    
private:
//聲明所有的組件
    QLabel *hostLabel;
    QPushButton *detailButton;
    QLabel *ipLabel;
    QlineEdit *LineEditLocalHostName;
    QLineEdit *LineEditAddress;
//聲明組件的排序方式為GridLayout,即表格放置方式,這里只用指定坐標即可將組件按布局放置。   
    QGridLayout *mainLayout;
};

#endif // NETWORK2_H

生成的結果如下:
02.png
然后在network2.cpp里實現所有組件的布局:

#include "network2.h"

Network2::Network2(QWidget *parent)
    : QWidget(parent)
{
    hostLabel = new QLabel(tr("主機名:"));
    ipLabel = new QLabel(tr("ip地址:"));

    LineEditLocalHostName = new QLineEdit;
    LineEditAddress = new QLineEdit;

    detailButton = new QPushButton(tr("詳細"));

    mainLayout = new QGridLayout(this);
    mainLayout->addWidget(hostLabel,0,0);
    mainLayout->addWidget(LineEditLocalHostName,0,1);
    mainLayout->addWidget(ipLabel,1,0);
    mainLayout->addWidget(LineEditAddress,1,1);
    mainLayout->addWidget(detailButton,2,0,1,2);

}

Network2::~Network2()
{

}
注意到`Network2::Network2(QWidget *parent)
QWidget(parent) ,這里的parent表示在這里已經創建了一個父對象,程序后面有一個 mainLayout = new QGridLayout(this);`
this指針的意思就是這個布局依附在這個父組件主窗口上成為子組件,這樣講或許比較抽象,利用圖表進行說明就很形象生動。
03.png
還有一點就是在main函數中,要用已經創建的類network2 w。

功能實現

首先在qt的.pro文件中添加QT += network,表示啟用了qt的網絡功能。加上后,Qt會自動將與network相關的頭文件引入。
在頭文件中再增加功能代碼:

#include <QHostInfo>
#include <QNetworkInterface>
public:
    void getHostInformation();
public slots:
    void slotDetail();

再在network2.cpp文件中實現功能,main.app目前只是負責將窗口顯現,具體的功能還是需要在network2.cpp實現。下面編寫network2.cpp部分的代碼:

void Network2::getHostInformation()
{
    QString localHostName = QHostInfo::localHostName();//通過QHostInfo的localHostName函數獲取主機名稱並以字符串的形式存入localHostName
    LineEditLocalHostName->setText(localHostName);//加到先前空的表單中

    QHostInfo hostInfo = QHostInfo::fromName(localHostName); //通過主機名查詢ip地址
    QList<QHostAddress> listAddress = hostInfo.addresses(); //從localHostName中得到addresses存入listAddress中

    if(!listAddress.isEmpty())
    {
         LineEditAddress->setText(listAddress.at(2).toString());
    }
}

void Network2::slotDetail()
{
    QString detail="";
    QList<QNetworkInterface> list=QNetworkInterface::allInterfaces();

    for(int i=0;i<list.count();i++)
    {
        QNetworkInterface interface = list.at(i);
        detail = detail+tr("設備:")+interface.name()+"\n";
        detail = detail+tr("硬件地址:")+interface.hardwareAddress()+"\n";
        QList<QNetworkAddressEntry> entryList=interface.addressEntries();
        for(int j=0;j<entryList.count();j++)
        {
           QNetworkAddressEntry entry=entryList.at(j);
           detail=detail+"\t"+tr("IP 地址:")+entry.ip().toString()+"\n";
           detail=detail+"\t"+tr("子網掩碼:")+entry.netmask().toString() +"\n";
           detail=detail+"\t"+tr("廣播地址:")+entry.broadcast().toString() +"\n";
        }
        
    }
    QMessageBox::information(this,tr("Detail"),detail);
}

其中,interface.name()為獲得網絡接口的名稱;interface.hardwareAddress()為網絡接口的硬件地址;interface.addressEntries()為每個網絡接口所對應的ip地址,包括其中的相關的子網掩碼和廣播地址。

結果圖

04.png

可以說Qt中關於網絡的部分已經有了大量的封裝庫,實現起來還是比較簡單。下一篇文章將介紹利用Qt做聊天室。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM