这里写目录标题
获取本机IP地址
cpp
复制代码
QStringList Network::getIPNetMaskBroadcast()
{
QStringList ipAddresses;
foreach (const QNetworkInterface &interface, QNetworkInterface::allInterfaces())
{
//if(interface.flags() & QNetworkInterface::IsUp && !(interface.flags() & QNetworkInterface::IsLoopBack))
foreach (const QNetworkAddressEntry &entry, interface.addressEntries())
{
if (entry.ip().protocol() == QAbstractSocket::IPv4Protocol && entry.ip() != QHostAddress::LocalHost)
{
ipAddresses.append(entry.ip().toString());
ipAddresses.append(entry.netmask().toString());
ipAddresses.append(entry.broadcast().toString());
qDebug()<<entry.ip().toString();
qDebug()<<entry.netmask().toString();
qDebug()<<entry.broadcast().toString();
}
}
}
return ipAddresses;
}
获取网关IP地址
cpp
复制代码
// 获取本机网关IP地址
QString Network::getGatewayIP() {
QProcess process;
process.start("netstat -rn");
process.waitForFinished();
QByteArray output = process.readAllStandardOutput();
QStringList lines = QString(output).split('\n');
int index = -1;
foreach (const QString &line, lines) {
if (!line.contains("UG") && !line.contains("Gateway"))
continue;
QStringList items = line.simplified().split(' ');
if (items.contains("Gateway")) {
index = items.indexOf("Gateway");
continue;
}
if (items.contains("UG"))
return items.at(index);
}
return QString();
}
获取公网IP地址
cpp
复制代码
// 获取本机公网IP地址
QString Network::GetExternalIP() {
QNetworkConfigurationManager manager;
if (manager.isOnline()) {
// 1. 创建 QNetworkAccessManager 实例(通常只需一个全局实例)
QNetworkAccessManager *manager = new QNetworkAccessManager(this);
// 2. 创建 QNetworkRequest 实例并设置目标 URL 和请求头
QNetworkRequest request;
request.setUrl(QUrl("http://whois.pconline.com.cn/ipJson.jsp?json=true"));
// 可选:设置请求头,如指定内容类型
// request.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/json"));
// 3. 发送请求,获取 QNetworkReply 对象
QNetworkReply *reply = manager->get(request);
QEventLoop loop;
connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit);
loop.exec();
QString data = QString::fromLocal8Bit(reply->readAll());
QJsonDocument jsonDocument = QJsonDocument::fromJson(data.toUtf8());
QJsonObject jsonObject = jsonDocument.object();
QString ip = jsonObject.value("ip").toString();
//QString address = jsonObject.value("addr").toString().toUtf8();
qDebug() << "ip:" << ip ;
// qDebug() << "loaction:"<< address ;
// 重要:请求完成后,需要释放 reply 对象
reply->deleteLater();
return ip;
}
return QString();
}
cpp
复制代码
#ifndef NETWORK_H
#define NETWORK_H
#include <QDialog>
#include <QFormLayout>
#include <QPushButton>
#include <QMessageBox>
#include <QDebug>
#include <QLineEdit>
#include <QLabel>
#include <QComboBox>
#include <QRadioButton>
#include <QString>
class Network : public QDialog
{
Q_OBJECT
public:
explicit Network(QWidget *parent = nullptr);
signals:
private slots:
void onConfirmClicked();
private:
QStringList getIPNetMaskBroadcast();
QString getGatewayIP();
QString GetExternalIP() ;
void IpNetMaskBroadcastReadOnly(bool b);
private:
QLineEdit *m_IpAddr;
QLineEdit *m_NetMask;
QLineEdit *m_Gateway;
QLineEdit *m_WifiPass;
QComboBox *m_WifiName;
QRadioButton * m_RBAutomatic;
QRadioButton * m_RBManual;
QRadioButton * m_RBWiFi;
};
#endif // NETWORK_H
cpp
复制代码
#include "network.h"
#include <QFormLayout>
#include <QGroupBox>
#include <QHostAddress>
#include <QNetworkInterface>
#include <QDebug>
#include <QProcess>
#include <QNetworkConfigurationManager>
#include <QNetworkAccessManager>
#include <QEventLoop>
#include <QNetworkReply>
#include <QJsonDocument>
#include <QJsonObject>
Network::Network(QWidget *parent) : QDialog(parent)
{
setWindowTitle("网络设置");
setAttribute(Qt::WA_DeleteOnClose);
setFixedSize(350,240);
QString ddvdvd = GetExternalIP();
QFont font;
font.setFamily(QString::fromUtf8("fzcy_GBK"));
font.setPointSize(14);
this->setFont(font);
m_IpAddr = new QLineEdit();
m_NetMask = new QLineEdit();
m_Gateway = new QLineEdit();
m_WifiPass = new QLineEdit();
m_WifiName=new QComboBox();
IpNetMaskBroadcastReadOnly(true);
m_RBAutomatic= new QRadioButton("自动获取",this);
m_RBManual= new QRadioButton("手动设置",this);
m_RBWiFi= new QRadioButton("WiFi",this);
m_RBAutomatic->setChecked(true);
QHBoxLayout * HBoxLayout = new QHBoxLayout();
//HBoxLayout->setAlignment(Qt::AlignCenter);
HBoxLayout->addWidget(m_RBAutomatic);
HBoxLayout->addWidget(m_RBManual);
HBoxLayout->addWidget(m_RBWiFi);
QGroupBox *groupBox = new QGroupBox(this);
groupBox->setStyleSheet("QGroupBox {border:0px solid vlack;}");
groupBox->setFixedWidth(350);
groupBox->setLayout(HBoxLayout);
QWidget *widget1 = new QWidget(this);
widget1->setFixedWidth(350);
widget1->move(0,50);
QWidget *widget2 = new QWidget(this);
widget2->setFixedWidth(350);
widget2->move(0,50);
widget2->hide();
QFormLayout * fLayout1 = new QFormLayout(widget1);
fLayout1->addRow(new QLabel("IP地址"),m_IpAddr);
fLayout1->addRow(new QLabel("子网掩码"),m_NetMask);
fLayout1->addRow(new QLabel("网关地址"),m_Gateway);
QFormLayout * fLayout2 = new QFormLayout(widget2);
fLayout2->addRow(new QLabel("Wifi名称"),m_WifiName);
fLayout2->addRow(new QLabel("Wifi密码"),m_WifiPass);
QPushButton * confirm = new QPushButton("确定",this);
confirm->move(135,195);
connect(confirm, &QPushButton::clicked, this, &Network::onConfirmClicked);
connect(m_RBAutomatic, &QPushButton::clicked, [=]() {
widget1->show(); widget2->hide(); IpNetMaskBroadcastReadOnly(true);
QList<QString> List = getIPNetMaskBroadcast();
m_IpAddr->setText(List[0]);m_NetMask->setText(List[1]);m_Gateway->setText(getGatewayIP());
});
connect(m_RBManual, &QPushButton::clicked, [=]() {widget1->show();widget2->hide();
IpNetMaskBroadcastReadOnly(false);
m_IpAddr->clear();m_NetMask->clear();m_Gateway->clear();});
connect(m_RBWiFi, &QPushButton::clicked, [=]() {widget1->hide();widget2->show();});
}
void Network::onConfirmClicked()
{
if(m_RBManual->isChecked()) {
QString IpAddr = m_IpAddr->text();
QString NetMask = m_NetMask->text();
QString Broadcast = m_Gateway->text();
if( IpAddr.isEmpty() || NetMask.isEmpty() || Broadcast.isEmpty())
QMessageBox::warning(this,"错误","不能为空");
qDebug()<<"m_RBManual";
}
else if(m_RBWiFi->isChecked()){
qDebug()<<"m_RBWiFi";
}
}
void Network::IpNetMaskBroadcastReadOnly(bool b)
{
m_IpAddr->setReadOnly(b);
m_NetMask->setReadOnly(b);
m_Gateway->setReadOnly(b);
}
QStringList Network::getIPNetMaskBroadcast()
{
QStringList ipAddresses;
foreach (const QNetworkInterface &interface, QNetworkInterface::allInterfaces())
{
//if(interface.flags() & QNetworkInterface::IsUp && !(interface.flags() & QNetworkInterface::IsLoopBack))
foreach (const QNetworkAddressEntry &entry, interface.addressEntries())
{
if (entry.ip().protocol() == QAbstractSocket::IPv4Protocol && entry.ip() != QHostAddress::LocalHost)
{
ipAddresses.append(entry.ip().toString());
ipAddresses.append(entry.netmask().toString());
ipAddresses.append(entry.broadcast().toString());
qDebug()<<entry.ip().toString();
qDebug()<<entry.netmask().toString();
qDebug()<<entry.broadcast().toString();
}
}
}
return ipAddresses;
}
// 获取本机网关IP地址
QString Network::getGatewayIP() {
QProcess process;
process.start("netstat -rn");
process.waitForFinished();
QByteArray output = process.readAllStandardOutput();
QStringList lines = QString(output).split('\n');
int index = -1;
foreach (const QString &line, lines) {
if (!line.contains("UG") && !line.contains("Gateway"))
continue;
QStringList items = line.simplified().split(' ');
if (items.contains("Gateway")) {
index = items.indexOf("Gateway");
continue;
}
if (items.contains("UG"))
return items.at(index);
}
return QString();
}
// 获取本机公网IP地址
QString Network::GetExternalIP() {
QNetworkConfigurationManager manager;
if (manager.isOnline()) {
// 1. 创建 QNetworkAccessManager 实例(通常只需一个全局实例)
QNetworkAccessManager *manager = new QNetworkAccessManager(this);
// 2. 创建 QNetworkRequest 实例并设置目标 URL 和请求头
QNetworkRequest request;
request.setUrl(QUrl("http://whois.pconline.com.cn/ipJson.jsp?json=true"));
// 可选:设置请求头,如指定内容类型
// request.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/json"));
// 3. 发送请求,获取 QNetworkReply 对象
QNetworkReply *reply = manager->get(request);
QEventLoop loop;
connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit);
loop.exec();
QString data = QString::fromLocal8Bit(reply->readAll());
QJsonDocument jsonDocument = QJsonDocument::fromJson(data.toUtf8());
QJsonObject jsonObject = jsonDocument.object();
QString ip = jsonObject.value("ip").toString();
//QString address = jsonObject.value("addr").toString().toUtf8();
qDebug() << "ip:" << ip ;
// qDebug() << "loaction:"<< address ;
// 重要:请求完成后,需要释放 reply 对象
reply->deleteLater();
return ip;
}
return QString();
}