2

QTcpServerとQTcpSocketがどのように機能するかを理解するのに役立つhello-worldプログラムを作成しました。その中で、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());
}
4

2 に答える 2

3

(私が思うに)最善の方法は、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()スロット機能で使用

于 2012-07-08T19:46:56.467 に答える
1

connectステートメントでC++11ラムダ関数を使用すると、sender()関数なしでこれを行うこともできます。

connect(socket, &QIODevice::readyRead,
        [this, socket()] { readData(socket) });

およびマッチング関数(必要はありませんが、スロットにすることができます):

void foo::readData(QTcpSocket *socket)
{
    socket->whatever();
}
于 2018-09-05T08:18:04.567 に答える