本页内容

QHostInfo Class

QHostInfo 类提供了用于主机名查询的静态函数。更多内容...

头文件: #include <QHostInfo>
CMake: find_package(Qt6 REQUIRED COMPONENTS Network)
target_link_libraries(mytarget PRIVATE Qt6::Network)
qmake: QT += network

注意:该类中的所有函数均为可重入函数。

注意:以下函数也是线程安全的:

公共类型

enum HostInfoError { NoError, HostNotFound, UnknownError }

公共函数

QHostInfo(int id = -1)
QHostInfo(const QHostInfo &other)
QHostInfo(QHostInfo &&other)
~QHostInfo()
QList<QHostAddress> addresses() const
QHostInfo::HostInfoError error() const
QString errorString() const
QString hostName() const
int lookupId() const
void setAddresses(const QList<QHostAddress> &addresses)
void setError(QHostInfo::HostInfoError error)
void setErrorString(const QString &str)
void setHostName(const QString &hostName)
void setLookupId(int id)
void swap(QHostInfo &other)
QHostInfo &operator=(QHostInfo &&other)
QHostInfo &operator=(const QHostInfo &other)

静态公共成员

void abortHostLookup(int id)
(since 6.12) void clearCache()
QHostInfo fromName(const QString &name)
QString localDomainName()
QString localHostName()
int lookupHost(const QString &name, const QObject *receiver, const char *member)
int lookupHost(const QString &name, Functor &&functor)
int lookupHost(const QString &name, const QObject *context, Functor functor)

详细说明

QHostInfo 可查找与主机名关联的 IP 地址,或查找与 IP 地址关联的主机名。该类提供了两个静态便捷函数:一个以异步方式工作,并在找到主机后发出信号;另一个则阻塞并返回一个 QHostInfo 对象。

要异步查询主机的 IP 地址,请调用 `lookupHost()`,该函数接受主机名或 IP 地址、一个接收器对象以及一个槽签名作为参数,并返回一个 ID。您可以通过使用查询 ID 调用 `abortHostLookup()` 来中止查询。

示例:

// To find the IP address of qt-project.org
QHostInfo::lookupHost("qt-project.org", this, &MyWidget::printResults);

// To find the host name for 4.2.2.1
QHostInfo::lookupHost("4.2.2.1", this, &MyWidget::printResults);

当结果准备就绪时,将调用该槽。结果存储在 QHostInfo 对象中。调用addresses() 可获取主机的 IP 地址列表,调用hostName() 可获取查询到的主机名。

如果查找失败,error() 将返回发生的错误类型。errorString() 则提供查找错误的人类可读描述。

若需阻塞式查询,请使用QHostInfo::fromName() 函数:

QHostInfo info = QHostInfo::fromName("qt-project.org");

QHostInfo 通过 IDNA 和 Punycode 标准支持国际化域名 (IDN)。

要获取本地主机的名称,请使用静态函数QHostInfo::localHostName()。

QHostInfo 使用操作系统提供的机制来执行查询。根据RFC 6724的规定,无法保证会返回某个域名或主机注册的所有 IP 地址。

注意:自 Qt 4.6.1起, QHostInfo 采用多线程进行 DNS 查询,而非单个专用 DNS 线程。这虽然提高了性能,但也导致与 Qt 早期版本相比,使用lookupHost() 时信号发出的顺序发生了变化。

注意:自 Qt 4.6.3起 ,QHostInfo 为提升性能,开始使用一个 60 秒的小型内部 DNS 缓存。

另请参阅 QAbstractSocket 、RFC 3492 和RFC 6724。

成员类型文档

enum QHostInfo::HostInfoError

此枚举描述了在尝试解析主机名时可能出现的各种错误。

常量值描述
QHostInfo::NoError0查找成功。
QHostInfo::HostNotFound1未找到该主机的 IP 地址。
QHostInfo::UnknownError2发生了一个未知错误。

另请参阅 error() 和setError()。

成员函数文档

[explicit] QHostInfo::QHostInfo(int id = -1)

创建一个查找 ID 为id 的空主机信息对象。

另请参阅 lookupId()。

QHostInfo::QHostInfo(const QHostInfo &other)

创建other 的一个副本。

[noexcept] QHostInfo::QHostInfo(QHostInfo &&other)

从 `other` 创建一个新的 `QHostInfo` 对象。

注意: 被移动的源对象 other 将处于部分构建状态,在此状态下,唯一有效的操作是销毁和赋予新值。

[noexcept] QHostInfo::~QHostInfo()

销毁主机信息对象。

[static] void QHostInfo::abortHostLookup(int id)

中止对 ID 为id 的主机查找,该 ID 由lookupHost() 返回。

注意:此函数是线程安全的。

另请参阅 lookupHost() 和lookupId()。

QList<QHostAddress> QHostInfo::addresses() const

返回与hostName()关联的IP地址列表。该列表可能为空。

示例:

QHostInfo info;
...
if (!info.addresses().isEmpty()) {
    QHostAddress address = info.addresses().first();
    // use the first IP address
}

另请参阅 setAddresses()、hostName() 和error()。

[static, since 6.12] void QHostInfo::clearCache()

清除由lookupHost() 和fromName() 使用的内部 DNS 缓存。

当缓存的主机信息可能已过期且需要进行最新查询时,请调用此方法。典型用例包括:

  • 应用程序检测到网络配置发生变化(例如在 Wi-Fi 和以太网之间切换,或 VPN 连接/断开)。
  • 已知某服务器的地址已发生变更(例如动态 DNS 或故障转移),应用程序应重新解析该主机名。请注意,上游 DNS 服务器和解析器拥有各自的 TTL,在此处清除缓存不会影响它们,因此在新查询中,在上游 TTL 过期之前,仍可能返回之前的地址。
  • 应用程序使用缓存结果进行查询,但如果缓存已过期或不再有效,则需要进行新的查询。

此函数仅清除缓存。它不会取消正在进行的查询;这些查询将完成,其结果仍会送达。当您希望未来的查询重新解析,同时不影响正在进行的操作时,请使用此函数。

注意:此函数是线程安全的。

该函数在 Qt 6.12 中引入。

另请参见 lookupHost() 和fromName()。

QHostInfo::HostInfoError QHostInfo::error() const

如果主机名查询失败,则返回发生的错误类型;否则返回NoError 。

另请参阅 setError() 和errorString()。

QString QHostInfo::errorString() const

如果查找失败,该函数将返回一条易于理解的错误说明;否则返回“未知错误”。

另请参阅 setErrorString() 和error()。

[static] QHostInfo QHostInfo::fromName(const QString &name)

查询给定主机name 的 IP 地址。该函数在查询过程中会阻塞,这意味着程序的执行将暂停,直到查询结果准备就绪。将查询结果返回至一个QHostInfo 对象中。

如果向name 传递的是 IP 地址字面量而非主机名,QHostInfo 将搜索该 IP 地址对应的域名(即QHostInfo 将执行反向解析)。成功时,返回的QHostInfo 将同时包含该主机名的解析域名和 IP 地址。

注意:此函数是线程安全的。

另请参阅 lookupHost()。

QString QHostInfo::hostName() const

返回其IP地址被查询的主机名称。

另请参阅 setHostName() 和localHostName()。

[static] QString QHostInfo::localDomainName()

返回此计算机的 DNS 域。

注意:DNS 域与 Windows 网络中的域名无关。

注意:此函数是线程安全的。

另请参阅 hostName()。

[static] QString QHostInfo::localHostName()

返回该机器的主机名(如果已配置)。请注意,主机名并不保证在全球范围内唯一,尤其是当它们是自动配置时。

此函数不保证返回的主机名是完全限定域名(FQDN)。如需将返回的名称解析为 FQDN,请使用fromName()。

此函数的返回结果与QSysInfo::machineHostName() 相同。

注意:此函数是线程安全的。

另请参阅 hostName() 和localDomainName()。

[static] int QHostInfo::lookupHost(const QString &name, const QObject *receiver, const char *member)

查询与主机名name 关联的 IP 地址,并返回该查询的 ID。当查询结果准备就绪时,会通过QHostInfo 参数调用receiver 中的槽或信号member 。随后,可检查QHostInfo 对象以获取查询结果。

查找操作通过单次函数调用完成,例如:

QHostInfo::lookupHost("www.kde.org", this, &MyWidget::lookedUp);

该槽的实现会打印查找返回的地址的基本信息,或在查找失败时报告错误:

voidMyWidget::lookedUp(constQHostInfo&host)
{
    if(host.error()!=QHostInfo::NoError) {
        qDebug() << "Lookup failed:" << host.errorString();
       return;
    }

    const autoaddresses=host.addresses();
    for(constQHostAddress&address: addresses)
        qDebug() << "Found address:" << address.toString();
}

如果您向name 传递的是字面 IP 地址而非主机名,QHostInfo 将搜索该 IP 对应的域名(即QHostInfo 将执行反向查询)。若查询成功,生成的QHostInfo 将同时包含解析后的域名和该主机名的 IP 地址。示例:

QHostInfo::lookupHost("4.2.2.1", this, &MyWidget::lookedUp);

注意: 如果您使用 lookupHost() 发起多个请求,则 无法保证信号发出的顺序。

注意:在 Qt 6.7 之前的版本中,此函数将 `receiver ` 视为 (非 const) `QObject*`。

注意:此函数是线程安全的。

另请参阅 abortHostLookup()、addresses()、error() 和fromName()。

[static] template <typename Functor> int QHostInfo::lookupHost(const QString &name, Functor &&functor)

查询与主机名name 关联的 IP 地址,并返回该查询的 ID。当查询结果准备就绪时,会通过QHostInfo 参数调用functor 函数。随后可通过检查QHostInfo 对象来获取查询结果。

functor 将在调用 lookupHost 的线程中运行;该线程必须有一个正在运行的 Qt 事件循环。

注意: 如果您使用 lookupHost() 发起多个请求,则 无法保证信号的触发顺序。

这是一个重载函数。

注意:此函数是线程安全的。

另请参阅 abortHostLookup()、addresses()、error() 和fromName()。

[static] template <typename Functor> int QHostInfo::lookupHost(const QString &name, const QObject *context, Functor functor)

查询与主机名name 关联的 IP 地址,并返回一个查询 ID。当查询结果准备就绪时,会调用functor 方法,并传入QHostInfo 参数。随后可通过检查QHostInfo 对象来获取查询结果。

如果在查询完成之前销毁了context ,则不会调用functor 。functor 将在context 所属的线程中执行。上下文所属的线程必须有一个正在运行的Qt事件循环。

以下是该函数的另一种签名:

lookupHost(const QString &name, const QObject *receiver, PointerToMemberFunction function)

在这种情况下,当查找结果准备就绪时,receiver 中的槽或信号function 将被调用,并传入QHostInfo 作为参数。随后可以检查QHostInfo 对象以获取查找结果。

注意: 若通过 `lookupHost()` 发起多个请求,则 无法保证信号的触发顺序。

这是一个重载函数。

注意:此函数是线程安全的。

另请参阅 abortHostLookup()、addresses()、error() 以及fromName()。

int QHostInfo::lookupId() const

返回此查找的 ID。

另请参阅 setLookupId()、abortHostLookup() 和hostName()。

void QHostInfo::setAddresses(const QList<QHostAddress> &addresses)

将此QHostInfo 中的地址列表设置为addresses 。

另请参阅 addresses()。

void QHostInfo::setError(QHostInfo::HostInfoError error)

将此QHostInfo 的错误类型设置为error 。

另请参阅 error() 和errorString()。

void QHostInfo::setErrorString(const QString &str)

如果查找失败,则将发生的错误的通俗描述设置为str 。

另请参阅 errorString() 和setError()。

void QHostInfo::setHostName(const QString &hostName)

将此QHostInfo 的主机名设置为hostName 。

另请参阅 hostName()。

void QHostInfo::setLookupId(int id)

将此查找的 ID 设置为id 。

另请参阅 lookupId() 和lookupHost()。

[noexcept] void QHostInfo::swap(QHostInfo &other)

将此主机信息替换为other 。此操作非常快,且绝不会失败。

[noexcept] QHostInfo &QHostInfo::operator=(QHostInfo &&other)

将other 通过移动赋值操作赋值给此QHostInfo 实例。

注意: 被移动的源对象 other 将处于部分初始化状态,在此状态下,唯一有效的操作是销毁和赋值。

QHostInfo &QHostInfo::operator=(const QHostInfo &other)

将other 对象的数据赋值给此主机信息对象,并返回对其的引用。

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.