1.想要在程序中使用 Qt 网络模块,我们需要在 pro 项目配置文件里增加下面的一条语句:
QT += network
2.获取本机的网络信息
Qt 提供了 QHostInfo 和 QNetworkInterface 类用于关于本机的网络信息查询(IP地址、MAC地址、主机名)。
private:
/*点击获取和清空文本按钮*/
QPushButton *pushButton[2];
/*文本浏览框用于显示本机的信息*/
QTextBrowser *textBrowser;
/*点击获取本地信息按钮和清空文本按钮*/
pushButton[0] = new QPushButton();
pushButton[1] = new QPushButton();
pushButton[0]->setText("获取本机信息");
pushButton[1]->setText("清空文本信息");
/*按钮的大小根据文本自适应,注意setSizePolicy需要在布局中使用*/
pushButton[0]->setSizePolicy(QSizePolicy::Fixed,QSizePolicy::Fixed);
pushButton[1]->setSizePolicy(QSizePolicy::Fixed,QSizePolicy::Fixed);
/*定时器初始化*/
timer = new QTimer();
connect(pushButton[0], SIGNAL(clicked()), this, SLOT(timerStart()));
connect(pushButton[1], SIGNAL(clicked()), this, SLOT(clearHostInfo()));
connect(timer, SIGNAL(timeout()), this, SLOT(timerTimeOut()));
void MainWindows::timerStart()
{
/*清空文本*/
textBrowser->clear();
/*定时1s*/
timer->start(1000);
}
void MainWindows::timerTimeOut()
{
/*显示本机信息*/
showHostInfo();
/*停止定时器*/
timer->stop();
}
QString MainWindow::getHostInfo()
{
/*通过QHostInfo的localHostName函数获取主机名称*/
QString str = "主机名称:" + QHostInfo::localHostName() + "\n";
/*获取所有的网络接口,QNetworkInterface类提供主机的IP地址和网络接口的列表*/
QList<QNetworkInterface> list = QNetworkInterface::allInterfaces();
/*遍历list*/
foreach(QNetworkInterface interface, list){
str += "网卡设备:" + interface.name() + "\n";
str += "MAC地址:" + interface.harwareAddress() + "\n";
/*QNetworkAddressEntry类存储IP地址子网掩码和广播地址*/
QList<QNetworkAddressEntry> entryList = interface.addressEntrties();
/* 遍历 entryList */
foreach(QNetworkAddressEntry entry, entryList){
/* 过滤 IPv6 地址,只留下 IPv4 */
if(entry.ip().protocol()) == QAbstractSocket::IPv4Protocol {
str += "IP地址:" + entry.ip().toString() + "\n";
str+= "子网掩码:" + entry.netmask().toString() + "\n";
str+= "广播地址:" + entry.broadcast().toString() + "\n\n";
}
}
}
/*返回网络信息*/
return str;
}
void MainWindows::showHostInfo()
{
/*获取本机信息后显示到textBrowser*/
textBrowser->insertPlainText(getHostInfo());
}
void MainWindow::clearHostInfo()
{
/* 判断 textBrowser 是否为空,如果不为空则清空文本 */
if (!textBrowser->toPlainText().isEmpty())
/*清空文本*/
textBrowser->clear();
}