c++ - 我如何知道哪个QTcpSocket发出了readyRead()信号?

标签 c++ qt signals-slots qtcpsocket

我创建了一个 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/

相关文章:

Qt Creator `.pro.shared` 文件似乎没有任何效果

c++ - C++中事件系统的原理是什么?

c++ - Qt connect() 用法

c++ - 错误的输出或从标准输入读取,C++

c++ - map /对中的运算符重载

c++ - 不使用静态变量的原因?

c++ - 观察 QSharedMemory 的变化

c++ - 需要帮助调试我的第一个程序,Visual Studio 找不到 .exe 文件。

qt - Qml、SQLite 和 EstimatedSize 参数

c++ - Qt::QueuedConnection 在单线程应用程序中是如何工作的?