1. 程式人生 > 其它 >Qt 實現主機資訊查詢

Qt 實現主機資訊查詢

protocol() QAbstractSocket::NetworkLayerProtocol型別變數,表示當前IP地址的協議型別  型別如下:
  QAbstractSocket::IPv4Protocol
  QAbstractSocket::IPv6Protocol
  QAbstractSocket::AnyIPProtocol
  QAbstractSocket::UnknowNetworkLayerProtocol
toString() 返回IP地址的字串,表示程式中顯示了IP地址列表中每個IP地址的協議型別和IP地址字串


#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QAbstractSocket>
#include <QHostInfo>
#include <QNetworkInterface>
#include <QHostAddress>
namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void on_pushButton_clicked();

    void on_pushButton_2_clicked();

    void on_pushButton_3_clicked();

    void on_pushButton_4_clicked();

    void on_pushButton_5_clicked();

    void lookedUpHostInfo(const QHostInfo &info);

private:
    Ui::MainWindow *ui;
    QString protoclName(QAbstractSocket::NetworkLayerProtocol protocol);
};

#endif // MAINWINDOW_H

#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_clicked()
{
    //獲取主機資訊
    QString hostname = QHostInfo::localHostName(); //本地主機名
    ui->plainTextEdit->appendPlainText("本地主機名:"+hostname+"\n");
    QHostInfo hostinfo = QHostInfo::fromName(hostname); //本機IP

    QList<QHostAddress> addList = hostinfo.addresses();// IP地址列表
    if(!addList.isEmpty())
    {
        for(int i =0;i<addList.count();i++)
        {
            QHostAddress aHost = addList.at(i);
            bool show = ui->checkBox->isChecked(); //只顯示IPV4
            if(show)
            {
                show = (QAbstractSocket::IPv4Protocol == aHost.protocol());
            }else {
                show = true;
            }
            if(show)
            {
                ui->plainTextEdit->appendPlainText("協議:"+protoclName(aHost.protocol()));
                ui->plainTextEdit->appendPlainText("本機IP地址:"+aHost.toString());
                ui->plainTextEdit->appendPlainText("");
            }
        }
    }

}

void MainWindow::on_pushButton_2_clicked()
{
    QList<QHostAddress> list = QNetworkInterface::allAddresses();
        if(!list.isEmpty())
        for(int i =0;i<list.count();i++)
        {
            QHostAddress aHost = list.at(i);
            bool show = ui->checkBox->isChecked();
            if(show)
                show=QAbstractSocket::IPv4Protocol == aHost.protocol();
            else
                show =true;
            if(show)
            {
                ui->plainTextEdit->appendPlainText("協議"+protoclName(aHost.protocol()));
                ui->plainTextEdit->appendPlainText("IP地址"+aHost.toString());
                ui->plainTextEdit->appendPlainText("");
            }
        }
}

void MainWindow::on_pushButton_3_clicked()
{
    QList<QNetworkInterface> list = QNetworkInterface::allInterfaces();
    for(int i=0;i<list.count();i++)
    {
        QNetworkInterface aInterface = list.at(i);
        if(!aInterface.isValid())
        {
            continue;
        }
        ui->plainTextEdit->appendPlainText("裝置名稱"+aInterface.humanReadableName());
        ui->plainTextEdit->appendPlainText("硬體地址"+aInterface.hardwareAddress());
        QList<QNetworkAddressEntry> entry = aInterface.addressEntries();
        for(int j = 0;j<entry.count();j++)
        {
            QNetworkAddressEntry aEntry = entry.at(j);
            ui->plainTextEdit->appendPlainText("IP地址"+ aEntry.ip().toString());
            ui->plainTextEdit->appendPlainText("子網掩碼"+ aEntry.netmask().toString());
            ui->plainTextEdit->appendPlainText("廣播地址"+ aEntry.broadcast().toString() + "\n");
        }
        ui->plainTextEdit->appendPlainText("\n");
    }
}

void MainWindow::on_pushButton_4_clicked()
{
    QString hostname = ui->lineEdit->text(); //主機名
    ui->plainTextEdit->appendPlainText("正在查詢主機資訊"+ hostname);
    QHostInfo::lookupHost(hostname,this,SLOT(lookedUpHostInfo(QHostInfo)));

}

void MainWindow::on_pushButton_5_clicked()
{
    ui->plainTextEdit->clear();
}
void MainWindow::lookedUpHostInfo(const QHostInfo & info)
{

    QList<QHostAddress> addList = info.addresses();
    if(!addList.isEmpty());
    for(int i =0;i < addList.count(); i++)
    {
        QHostAddress aHost = addList.at(i);
        bool show = ui->checkBox->isChecked();
        if(show)
            show = QAbstractSocket::IPv4Protocol ==aHost.protocol();
        else
            show = true;
        if(show)
        {
            ui->plainTextEdit->appendPlainText("協議"+protoclName(aHost.protocol()));
            ui->plainTextEdit->appendPlainText(aHost.toString());
        }
    }

}
//根據protocol()返回的QabstractSocket::NetworkLayerProtocol  列舉值顯示協議名稱字串
QString MainWindow::protoclName(QAbstractSocket::NetworkLayerProtocol protocol)
{
    switch (protocol)
    {
    case QAbstractSocket::IPv4Protocol:
        return "IPV4 Protocol";
    case QAbstractSocket::IPv6Protocol:
        return "IPV4 Protocol";
    case QAbstractSocket::AnyIPProtocol:
        return "IPV4 Protocol";
    default:
        return "Unknow Network Layer Protocol";
    }
}