原文地址
前言
QT
下获取可用IP
地址比较简单,一般的实现方法为
void IndexWidget::updateMsg()
{
// update ip
bool hasLink = false;
const QHostAddress& localhost = QHostAddress(QHostAddress::LocalHost);
for (const QHostAddress& address : QNetworkInterface::allAddresses())
{
if (address.protocol() == QAbstractSocket::IPv4Protocol && address != localhost)
{
hasLink = true;
lineLabel->setText(QString::fromUtf8("IP: ") + address.toString());
}
}
if (!hasLink)
{
lineLabel->setText(QString::fromUtf8("IP: 无连接"));
}
// ...
}
但是这种方式无法区别有线和无线,有线和无线的区分可以使用addressEntries
来代替allAddresses
进行循环迭代
实现
具体代码如下
void IndexWidget::updateMsg()
{
// update ip
bool hasWired = false;
bool hasWireless = false;
for (const QNetworkInterface& address : QNetworkInterface::allInterfaces())
{
if (!address.flags().testFlag(QNetworkInterface::IsRunning))
{
continue;
}
for (const QNetworkAddressEntry& entry : address.addressEntries())
{
if (entry.ip().protocol() == QAbstractSocket::IPv4Protocol && entry.ip() != QHostAddress(QHostAddress::LocalHost))
{
if (address.type() == QNetworkInterface::Wifi)
{
hasWireless = true;
wifiLabel->setText(QString::fromUtf8("无线: ") + entry.ip().toString());
}
else
{
hasWired = true;
lineLabel->setText(QString::fromUtf8("有线: ") + entry.ip().toString());
}
}
}
}
if (!hasWired)
{
lineLabel->setText(QString::fromUtf8("有线:无连接"));
}
if (!hasWireless)
{
wifiLabel->setText(QString::fromUtf8("无线:无连接"));
}
// ...
}
顺便贴上相关官方文档QNetworkInterface Class以供更多需求查询
补充
我们可以看到QNetworkInterface::type() const
这个函数是在5.11
版本中引入的,那么之前版本的小伙伴应该怎么办呢。我目前想到的方案只有写死网卡名称,比如一般的eth0
这种,如果是独立开发运行的机器也可以按照MAC地址
判断,如果有大家有更好的方案可以评论区提出