我创建了一个 hello-world 程序来帮助我了解 QTcpServer 和 QTcpSocket 的工作原理。在其中,QTcpServer 接受新连接并将其 readyRead()
信号连接到 MainWindow::onNewData()
插槽,其中新数据将附加到纯文本控件。
问题在于可以同时打开多个套接字。因此,当我收到 readyRead()
信号并且想使用 readAll()
读取数据时,我如何知道哪个套接字发出了它?
这是代码的相关部分。我根本没有在这里存储 QTcpSocket 指针,但即使我这样做了,我仍然不知道它们中的哪一个发出了信号。
// constructor
server = new QTcpServer(this);
connect(server, SIGNAL(newConnection()), this, SLOT(onNewConnection()));
server->listen(QHostAddress::LocalHost, 3333);
void MainWindow::onNewConnection()
{
QTcpSocket* socket = server->nextPendingConnection();
connect(socket, SIGNAL(disconnected()), socket, SLOT(deleteLater()));
connect(socket, SIGNAL(readyRead()), this, SLOT(onNewData()));
}
void MainWindow::onNewData()
{
ui->plainTextEdit->appendPlainText(WHICH_SOCKET_EMITTED_IT()->readAll());
}
最佳答案
最好的方法(在我看来)是实现您自己的 Client
类,该类将封装 QTcpSocket
class Client : public QObject
{
Q_OBJECT
public:
Client(QTcpSocket *socket)
: m_socket(socket)
{
connect(socket, SIGNAL(readyRead()), this, SLOT(onNewData()));
}
private slots:
void onNewData();
private:
QTcpSocket *m_socket;
};
最简单的方法:在槽函数中使用QObject::sender()
关于c++ - 我如何知道哪个QTcpSocket发出了readyRead()信号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11386014/