本页内容

QSocketNotifier Class

QSocketNotifier 类提供了对文件描述符上活动情况的监视支持。更多内容...

头文件: #include <QSocketNotifier>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core
继承自: QObject

公共类型

enum Type { Read, Write, Exception }

公共函数

(since 6.1) QSocketNotifier(QSocketNotifier::Type type, QObject *parent = nullptr)
QSocketNotifier(qintptr socket, QSocketNotifier::Type type, QObject *parent = nullptr)
virtual ~QSocketNotifier()
bool isEnabled() const
(since 6.1) bool isValid() const
(since 6.1) void setSocket(qintptr socket)
qintptr socket() const
QSocketNotifier::Type type() const

公共插槽

void setEnabled(bool enable)

信号

void activated(QSocketDescriptor socket, QSocketNotifier::Type type)

重新实现的受保护函数

virtual bool event(QEvent *e) override

详细说明

QSocketNotifier 使得 Qt 的事件循环能够与基于文件描述符的其他事件循环集成。文件描述符的操作会在 Qt 的主事件循环中被检测到(QCoreApplication::exec())。

一旦您使用低级(通常是平台特定的)API 打开了一个设备,就可以创建一个套接字通知器来监视该文件描述符。 如果将文件描述符传递给通知器的构造函数,则该套接字通知器默认处于启用状态,即每当发生与其类型对应的套接字事件时,它都会发出activated() 信号。将activated() 信号连接到您希望在发生与该套接字通知器类型对应的事件时被调用的槽函数。

您可以创建一个未分配描述符的套接字通知器。在这种情况下,您应在获取描述符后调用setSocket() 函数。

套接字通知器有三种类型:读取、写入和异常。类型由 `Type ` 枚举定义,并在创建套接字通知器时必须指定。创建完成后,可通过 `type()` 函数查询其类型。 请注意,若需同时监听同一文件描述符的读写操作,必须创建两个套接字通知器。此外,请注意无法在同一套接字上安装两个同类型的套接字通知器(Read 、Write 、Exception )。

setEnabled() 函数可用于启用或禁用套接字通知器。通常建议显式地启用或禁用套接字通知器,尤其是对于写入通知器。已禁用的通知器会忽略套接字事件(效果等同于未创建该套接字通知器)。请使用isEnabled() 函数来确定通知器的当前状态。

最后,您可以使用socket() 函数来获取套接字标识符。尽管该类名为 QSocketNotifier,但通常用于套接字以外的其他类型设备。QTcpSocket 和QUdpSocket 通过信号提供通知,因此通常无需在它们上使用 QSocketNotifier。

另请参阅 QFile 、QProcess 、QTcpSocket 以及QUdpSocket 。

成员类型文档

enum QSocketNotifier::Type

该枚举描述了套接字通知器能够识别的各种事件类型。在构建套接字通知器时,必须指定该类型。

请注意,如果需要同时监视同一文件描述符的读取和写入操作,则必须创建两个套接字通知器。另请注意,无法在同一个套接字上安装两个相同类型的套接字通知器(读取、写入、异常)。

常量值描述
QSocketNotifier::Read0有待读取的数据。
QSocketNotifier::Write1可以写入数据。
QSocketNotifier::Exception2发生了异常。我们建议不要使用此选项。

另请参阅 QSocketNotifier() 和type()。

成员函数文档

[explicit, since 6.1] QSocketNotifier::QSocketNotifier(QSocketNotifier::Type type, QObject *parent = nullptr)

使用给定的type 构建一个尚未分配描述符的套接字通知器。parent 参数将传递给QObject 的构造函数。

调用setSocket()函数来设置待监视的描述符。

该函数在 Qt 6.1 中引入。

另请参阅 setSocket()、isValid() 和isEnabled()。

QSocketNotifier::QSocketNotifier(qintptr socket, QSocketNotifier::Type type, QObject *parent = nullptr)

使用给定的parent 构建一个套接字通知器。它会启用socket ,并监听给定type 的事件。

通常建议显式启用或禁用套接字通知器,尤其是对于写入通知器。

Windows 用户注意:传递给 QSocketNotifier 的套接字将变为非阻塞模式,即使它最初是作为阻塞套接字创建的。

另请参阅 setEnabled() 和isEnabled()。

[virtual noexcept] QSocketNotifier::~QSocketNotifier()

销毁此套接字通知器。

[private signal] void QSocketNotifier::activated(QSocketDescriptor socket, QSocketNotifier::Type type)

每当套接字通知器处于启用状态,且发生了与其type 对应的套接字事件时,都会发出此信号。

套接字标识符通过socket 参数传递。

注意:这是一个 私有信号。它可以在信号连接中使用,但用户无法触发它。

注意:此 信号已被重载。要连接到此信号:

// Connect using qOverload:
connect(socketNotifier, qOverload(&QSocketNotifier::activated),
        receiver, &ReceiverClass::slot);

// Or using a lambda:
connect(socketNotifier, qOverload(&QSocketNotifier::activated),
        this, [](QSocketDescriptor socket, QSocketNotifier::Type type) { /* handle activated */ });
有关更多示例和方法,请参阅“连接到重载信号”。

另请参阅 type()和socket()。

[override virtual protected] bool QSocketNotifier::event(QEvent *e)

重写了:QObject::event(QEvent *e)。

bool QSocketNotifier::isEnabled() const

如果通知器已启用,则返回true ;否则返回false 。

另请参阅 setEnabled()。

[since 6.1] bool QSocketNotifier::isValid() const

如果通知器有效(即已分配了描述符),则返回true ;否则返回false 。

该函数在 Qt 6.1 中引入。

另请参阅 setSocket()。

[slot] void QSocketNotifier::setEnabled(bool enable)

如果 `enable ` 为真,则通知器处于启用状态;否则,通知器处于禁用状态。

当通知器被启用时,每当发生与其type 对应的套接字事件,它就会发出activated()信号。当它被禁用时,它会忽略套接字事件(效果与未创建套接字通知器相同)。

写入通知器通常应在发出activated() 信号后立即禁用

另请参阅 isEnabled() 和activated()。

[since 6.1] void QSocketNotifier::setSocket(qintptr socket)

将socket 分配给此通知器。

注意:此操作 会产生副作用,即通知器 将被禁用,需要重新启用。

该函数在 Qt 6.1 中引入。

另请参阅 socket()、setEnabled() 以及isValid()。

qintptr QSocketNotifier::socket() const

返回分配给该对象的套接字标识符。

另请参阅 setSocket()、isValid() 和type()。

QSocketNotifier::Type QSocketNotifier::type() const

返回在构造函数中指定的套接字事件类型。

另请参阅 socket()。

© 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.