目标是: 以一个对话框作服务器主界面,上面放一个QListWidget, 里面显示所有当前在线用户的名字。 为每个在线用户启动一个单独的线程提供服务。
设计: 对话框类ReceiverDialog从QDialog继承而来, 服务器类 ReceiverServer 从QTcpServer继承而来, 线程类ReceiverThread从QThread继承而来。
在ReceiverDialog类中添加一个成员变量 ReceiverServer server;
class ReceiverDialog : public QDialog
{
..............(省略)
private:
ReceiverServer server;
..............(省略)
}
并在ReceiverDialog的改造函数中开启服务器:
server.listen(QHostAddress::Any, 9090);
重写QTcpServer的incomingConnection函数
ReceiverServer::incomingConnection(int socketDescriptor)
{
ReceiverThread *thread = new ReceiverThread(socketDescriptor, this);
connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
thread->start();
}
当有新连接时,自动开启一个新的ReceiverThread线程,在该线程的run()函数中接收数据。
现在的问题是, 在run()中得到用户名的信息后,怎样把这个信息送到Dialog中显示? 我想在run()中发射一个信号,但是ReceiverThread跟ReceiverDialog之间还隔着一层ReceiverServer, 这个信号不能直接送到ReceiverDialog中。 如果在ReceiverThread中写connect()的话,不知道接收者该怎么写; 如果在ReceiverServer中写connect()的话,也不知道收者该怎么写; 如果在ReceiverDialog中写connect()的话, 不知道发射者该怎么写。