在创建QWSClient时,系统调用
QObject::connect(ad, SIGNAL(readyRead()),
q, SLOT(_q_doClient()));
把QAuthDevice(#ifndef QT_NO_SXE)的readyRead()信号和_q_doClient()函数联系到一块。而QAuthDevice在构造的时候通过
connect( m_target, SIGNAL(readyRead()),
this, SIGNAL(readyRead()));
和m_target联系到一块。m_target是相应QWSClient的QWSSocket。QWSSocket的readyRead()信号是通过QUnixSocket从QIODevice继承来的。而该信号是和QUnixSocketPrivate的readyRead()信号在QUnixSocketPrivate构造的时候联系在一起的。
QObject::connect(this, SIGNAL(readyRead()), me, SIGNAL(readyRead()))
me即是相应的QUnixSocket。在
void QUnixSocketPrivate::readActivated()
中会产生readyRead()信号。调用readActivated()槽函数的地方有两处,一处是
bool QUnixSocket::waitForReadyRead(int msecs)
,该函数调用
int rv = ::select(d->fd + 1, &readset, 0, 0, ptrTv)
查询QUnixSocket的套接字,如果有数据到来,激活readActivated()。调用waitForReadyRead()函数有多处
void QWSDisplay::Data::flush()
void QWSDisplay::Data::waitForConnection()
void QWSDisplay::Data::waitForRegionAck(int winId)
void QWSDisplay::Data::waitForRegionEvents(int winId, bool ungrabDisplay)
void QWSDisplay::Data::waitForCreation()
void QWSDisplay::Data::waitForPropertyReply()
void QWSDisplay::Data::waitForQCopResponse()
可以看出,这些都是用在一些需要同步通信的场合。
另一处调用readActivated()的地方是
QObject::connect(d->readNotifier, SIGNAL(activated(int)),
d, SLOT(readActivated()));
每一次消息循环都会检测所有的QSocketNotifier,如果该QSocketNotifier有变化,发出activated(int)信号,然后触发相应动作,在这里是readActivated()。
在QWSClient构造的时候会调用
connect(csocket, SIGNAL(readyRead()), this, SIGNAL(readyRead()));
函数,也就是说,QWSSocket的readyRead()会连接两个槽函数。实际上,QWSClient的readyRead()的信号是在(#ifndef QT_NO_SXE)选项不成立的时候才用到的,原理和刚才说的差不多。
阅读(652) | 评论(0) | 转发(0) |