读取Windows的IP地址有三种方法:
- QT的QNetworkInterface
- IPHlpApi
- QT的QSettings读注册表
修改windows的IP地址使用 netsh
netsh interface ipv4 set address name = "以太网" source = static address = 192.168.0.106 mask = 255.255.255.0 gateway = 192.168.0.1
代码:
QT的QNetworkInterface
void QtNetwork::initNetwork()
{
ui.comboBox->clear();
QString text;
QTextStream out(&text);
QList<QNetworkInterface> ifaceList = QNetworkInterface::allInterfaces();
for (int i = 0; i < ifaceList.count(); i++)
{
QNetworkInterface var = ifaceList.at(i);
out << QString::fromLocal8Bit("########## 设备%1 ############").arg(i) << endl;
out << QString::fromLocal8Bit("接口名称:") << var.humanReadableName() << endl;
out << QString::fromLocal8Bit("设备名称:") << var.name() << endl;
out << QString::fromLocal8Bit("硬件地址:") << var.hardwareAddress() << endl;
ui.comboBox->addItem(var.name());
out << QString::fromLocal8Bit("IP地址列表:") << endl;
// 读取一个IP地址的关联信息列表
QList<QNetworkAddressEntry> entryList = var.addressEntries();
for(int j = 0; j < entryList.count(); j++)
{
QNetworkAddressEntry entry = entryList.at(j);
out << QString::fromLocal8Bit("%1_地址:").arg(j) << endl;
out << QString::fromLocal8Bit(" IP地址:") << entry.ip().toString() << endl;
out << QString::fromLocal8Bit(" 子网掩码:") << entry.netmask().toString() << endl;
out << QString::fromLocal8Bit(" 广播地址:") << entry.broadcast().toString() << endl;
}
}
ui.textEdit->setPlainText(text);
}
IPHlpApi
void QtNetwork::initNetwork_IPHlpApi()
{
QString text;
QTextStream out(&text);
//IP_ADAPTER_INFO结构体
PIP_ADAPTER_INFO pIpAdapterInfo = NULL;
pIpAdapterInfo = new IP_ADAPTER_INFO;
//结构体大小
unsigned long ulSize = sizeof(IP_ADAPTER_INFO);
//获取适配器信息
int nRet = GetAdaptersInfo(pIpAdapterInfo, &ulSize);
if (ERROR_BUFFER_OVERFLOW == nRet)
{
//空间不足,删除之前分配的空间
delete[]pIpAdapterInfo;
//重新分配大小
pIpAdapterInfo = (PIP_ADAPTER_INFO) new BYTE[ulSize];
//获取适配器信息
nRet = GetAdaptersInfo(pIpAdapterInfo, &ulSize);
//获取失败
if (ERROR_SUCCESS != nRet)
{
if (pIpAdapterInfo != NULL)
{
delete[]pIpAdapterInfo;
}
return;
}
}
//MAC 地址信息
char szMacAddr[20];
//赋值指针
PIP_ADAPTER_INFO pIterater = pIpAdapterInfo;
int i = 0;
while (pIterater)
{
out << QString::fromLocal8Bit("########## 设备%1 ############").arg(i) << endl;
out << QString::fromLocal8Bit("网卡名称:") << pIterater->AdapterName << endl;
out << QString::fromLocal8Bit("网卡描述:") << pIterater->Description << endl;
sprintf_s(szMacAddr, 20, "%02X-%02X-%02X-%02X-%02X-%02X",
pIterater->Address[0],
pIterater->Address[1],
pIterater->Address[2],
pIterater->Address[3],
pIterater->Address[4],
pIterater->Address[5]);
out << QString::fromLocal8Bit("MAC 地址:") << szMacAddr << endl;
out << QString::fromLocal8Bit("IP地址列表:") << endl;
//指向IP地址列表
int j = 0;
PIP_ADDR_STRING pIpAddr = &pIterater->IpAddressList;
while (pIpAddr)
{
out << QString::fromLocal8Bit("%1_地址:").arg(j) << endl;
out << QString::fromLocal8Bit(" IP地址:") << pIpAddr->IpAddress.String << endl;
out << QString::fromLocal8Bit(" 子网掩码:") << pIpAddr->IpMask.String << endl;
//指向网关列表
PIP_ADDR_STRING pGateAwayList = &pIterater->GatewayList;
while (pGateAwayList)
{
out << QString::fromLocal8Bit(" 网关:") << pGateAwayList->IpAddress.String << endl;
pGateAwayList = pGateAwayList->Next;
}
pIpAddr = pIpAddr->Next;
j++;
}
pIterater = pIterater->Next;
i++;
}
//清理
if (pIpAdapterInfo)
{
delete[]pIpAdapterInfo;
}
ui.textEdit_2->setPlainText(text);
}
QT的QSettings读注册表
void QtNetwork::initNetwork_reg()
{
QString text;
QTextStream out(&text);
QSettings reg("HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\services\\Tcpip\\Parameters\\Interfaces\\", QSettings::NativeFormat);
QStringList groupsList = reg.childGroups();
qDebug() << "read size:" << groupsList.size();
int i = 0;
foreach(QString group, groupsList)
{
out << QString::fromLocal8Bit("########## 设备%1 ############").arg(i) << endl;
out << QString::fromLocal8Bit("设备名称:") << group << endl;
reg.beginGroup(group);
QString ip = reg.value("IPAddress").toString();
if (!ip.isEmpty())
{
out << QString::fromLocal8Bit(" IP地址:") << ip << endl;
}
QString netmask = reg.value("SubnetMask").toString();
if (!netmask.isEmpty())
{
out << QString::fromLocal8Bit(" 子网掩码:") << netmask << endl;
}
QString gateway = reg.value("DefaultGateway").toString();
if (!gateway.isEmpty())
{
out << QString::fromLocal8Bit(" 网关:") << gateway << endl;
}
reg.endGroup();
i++;
}
ui.textEdit_3->setPlainText(text);
}
修改IP地址
void QtNetworkEditDlg::on_pushButton_ok_clicked()
{
QString name = m_interface.humanReadableName();
QString ip = ui.lineEdit_ip->text();
QString netmask = ui.lineEdit_netmask->text();
QProcess cmd(this);
// netsh interface ipv4 set address name = "以太网" source = static
// address = 192.168.0.106 mask = 255.255.255.0 gateway = 192.168.0.1 gwmetric = 0
QString command = "netsh interface ipv4 set address name = "
+ name + " source = static address = " + ip
+ " mask = " + netmask;
cmd.start(command);
cmd.waitForFinished();
accept();
}
截图