学习qttelnet-2.1_1-opensource。
1、 QSocketNotifier的使用
QSocketNotifier在该类中使用的目的是用于:监听socket的exception。
但:QTcpSocket and QUdpSocket provide notification through signals, so there is normally no need to use a QSocketNotifier on them.
也就是说:QTcpSocket已经提供有readyRead()、error()的signal函数来监听是否可以读数据、是否有Exception;且该类中只使用了QTcpSocket来实现Telnet。
因此,QtTelnet类中对QSocketNotifier的操作是多余的?
2、 Close
1)QtTelnet::close()可以通过调用QtTelnetPrivate::socketConnectionClosed来实现,以增加code reuse。
2)loggedOut可能被emit两次。
该类中,在外部调用QtTelnet::close()时,loggedOut()信号会被emit两次。因为在QtTelnet::close()会调用“d->socket->close();”------关闭socket------触发QtTelnetPrivate::socketConnectionClosed------emit loggedOut(),而QtTelnet::close()也会emit loggedOut()。
可以将QtTelnet::close()中的emit loggedOut()删除掉,以解决该问题?
3、 QtTelnet类和QtTelnetPrivate之间的关系
类QtTelnetPrivate里含有指向QtTelnet的指针;类QtTelnet里又含有指向QtTelnetPrivate的指针。为什么会这样定义?
QtTelnetPrivate名字中“private”的含义可能就在于QtTelnetPrivate是QtTelnet私有的,即只能由QtTelnet使用。此处实现的关键在于:QtTelnet构造函数中对指向QtTelnetPrivate类的指针的初始化。以下是QtTelnet的构造函数:
QtTelnet::QtTelnet(QObject *parent)
: QObject(parent), d(new QtTelnetPrivate(this))
{
}
4、 QtTelnet的signal函数message()
该函数再QtTelnet的成员函数里并没有用到,而是在QtTelnetPrivate::parsePlaintext()里被emit,那为什么不直接把message()定义在QtTelnetPrivate类里?
经试验,不可以。
因为developer只能使用QtTelnet而不能使用QtTelnetPrivate,QtTelnet是由QtTelnetPrivate composition成的,developer的connect()只能使用QtTelnet里的函数。