Qt中QHostInfo类的使用
作者:互联网
Qt网络编程-主机信息查询
前言:
查询一个主机的MAC地址或IP地址是网络应用程序中经常用到的功能,Qt提供了QHostInfo类和QNetworkInterface类
可以用于此类信息的查询,完整代码见QT主机信息查询程序
运行效果图:
QHostInfo类
1.主要功能函数介绍(红色字体为本程序使用到)
类别 | 函数原型 | 作用 |
---|---|---|
公共函数 | QList<QHostAddress> addresses() | 返回与主机hostName()关联的IP地址列表 |
公共函数 | HostInfoError error() | 如果主机查找失败,返回失败类型 |
公共函数 | QString errorString() | 如果主机查找失败,返回错误描述字符串 |
公共函数 | QString hostName() | 通过IP查找的主机的名称 |
公共函数 | int lookupId() | 返回本次查找的ID |
静态函数 | void abortHostLookup(int id) | 根据id中断主机查找 |
静态函数 | QHostInfo fromName(QString &name) | 返回指定的主机名的IP地址 |
静态函数 | QString localDomainName() | 返回本机DNS域名 |
静态函数 | QString localHostName() | 返回本机主机名字 |
静态函数 | int lookupHost(QString& name,QObject* receiver,char* member) | 以异步的方式根据主机名查找主机的IP地址,并返回一个表示本次查找的额ID,可用于abortHostLookup() |
2.QHostInfo的使用
1)显示本机地址信息
- 通过协议类型返回协议名称
QString myWidget::protocolNmae(QAbstractSocket::NetworkLayerProtocol protocol)
{
switch (protocol)
{
case QAbstractSocket::IPv4Protocol:
return "IPV4 Protocol";
case QAbstractSocket::IPv6Protocol:
return "IPV6 Protocol";
case QAbstractSocket::AnyIPProtocol:
return "Any IP Protocol";
default:
return "Unkown Network Layer Protocol";
}
}
- 获取信息按钮槽函数
void myWidget::on_btnGetHostInfo_clicked()
{
//返回主机名
QString hostname = QHostInfo::localHostName();
ui->plainTextEdit->appendPlainText("本机名称:"+hostname);
//问题,不影响程序
//为什么这句编辑框出现乱码???????
//ui->plainTextEdit->appendPlainText("本机主机名:"+hostname);
//返回主机信息
QHostInfo hostInfo = QHostInfo::fromName(hostname);
//返回IP地址列表
QList<QHostAddress> addList = hostInfo.addresses();
//判断IP地址列表是否为空
if(!addList.isEmpty())
//遍历IP地址列表,输出主机信息
for(int i=0;i<addList.count();i++)
{
QHostAddress aHost = addList.at(i);
//输出IPV4信息
if(ui->chkIPV4->isChecked()&&(QAbstractSocket::IPv4Protocol==aHost.protocol()))
{
ui->plainTextEdit->appendPlainText("协议: "+protocolNmae(aHost.protocol()));
ui->plainTextEdit->appendPlainText("本机IPV4地址: "+aHost.toString());
ui->plainTextEdit->appendPlainText("");
}
//输出IPV6信息
if(ui->chkIPV6->isChecked()&&(QAbstractSocket::IPv6Protocol==aHost.protocol()))
{
ui->plainTextEdit->appendPlainText("协议: "+protocolNmae(aHost.protocol()));
ui->plainTextEdit->appendPlainText("本机IPV6地址: "+aHost.toString());
ui->plainTextEdit->appendPlainText("");
}
}
}
2)查找主机地址信息
- 在行编辑框输入要查找的主机名,域名,或IP地址,通过槽函数得到主机信息
void myWidget::on_btnLookUp_clicked()
{
QString hostname = ui->lineEdit->text();
ui->plainTextEdit->appendPlainText("正在查找主机信息:"+hostname);
QHostInfo::lookupHost(hostname,this,SLOT(OnLookuphostinfo(QHostInfo)));
}
- 查找的槽函数
void myWidget::OnLookuphostinfo(const QHostInfo &host)
{
//返回QHostInfo::NoError为查找成功
if (host.error() != QHostInfo::NoError)
{
ui->plainTextEdit->appendPlainText("Lookup Failed:"+host.errorString());
return;
}
//和上面遍历一样,用foreach()完成
foreach(const QHostAddress &aHost,host.addresses())
{
if(ui->chkIPV4->isChecked()&&(QAbstractSocket::IPv4Protocol==aHost.protocol()))
{
ui->plainTextEdit->appendPlainText("协议: "+protocolNmae(aHost.protocol()));
ui->plainTextEdit->appendPlainText("本机IPV4地址: "+aHost.toString());
ui->plainTextEdit->appendPlainText("");
}
if(ui->chkIPV6->isChecked()&&(QAbstractSocket::IPv6Protocol==aHost.protocol()))
{
ui->plainTextEdit->appendPlainText("协议: "+protocolNmae(aHost.protocol()));
ui->plainTextEdit->appendPlainText("本机IPV6地址: "+aHost.toString());
ui->plainTextEdit->appendPlainText("");
}
}
}
Qt中NetworkInterface类的使用-待完成
标签:Qt,appendPlainText,主机,QHostInfo,ui,使用,plainTextEdit,aHost 来源: https://blog.csdn.net/qq_38211856/article/details/111706664