一些說明
學了有一段時間的python了,小項目做了不少,最近由於項目需要,所以要回歸老本行了,開始重點突擊C++和qt。python的網絡爬蟲系列有時間就更吧。
獲取本機網絡信息
在網絡應用中,經常需要用到本機的主機名、IP地址、MAC地址等網絡信息,通常通過調出命令行窗口輸入ipconfig(Windows)或者ifconfig(Linux)就可以查看相關信息了,在這里我們利用qt作出一個可以查詢的界面和功能出來,為了后面的網絡編程打下一個簡單的基礎。
創建界面
創建一個Qt Widget項目,生成相關代碼如下圖:
然后我們開始編寫頭文件,在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
生成的結果如下:
然后在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指針的意思就是這個布局依附在這個父組件主窗口上成為子組件,這樣講或許比較抽象,利用圖表進行說明就很形象生動。
還有一點就是在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地址,包括其中的相關的子網掩碼和廣播地址。
結果圖
可以說Qt中關於網絡的部分已經有了大量的封裝庫,實現起來還是比較簡單。下一篇文章將介紹利用Qt做聊天室。