2

C サーバーに接続するクライアントを作成しようとしています。TCP を使用する必要があります。完全に機能するサーバーを既に持っていますが、クライアントに接続できません。サーバーにデータを送信したくありません (現時点では)。接続を確立して、新しいダイアログ ボックスを開きたいだけです。

以下は、Void Login::on_pushButton_clicked() スロットのコードです。// pushButton はログイン ボタンです

pSocket = new QTcpSocket (this);
connect (pSocket, SIGNAL(readyRead()), SLOT(waitNextStep()));
pSocket->connectToHost(ui->lineEdit->text(), ui->lineEdit_2->text().toInt());
if(pSocket->waitForConnected())
{
    Menu mMenu;
    mMenu.setModal(true);
    mMenu.exec();
}
else
{
    QMessageBox::critical(this,tr("Error"),tr("Error at Connect"));
}

私はすでに Menu クラスを定義しており、接続部分なしでテストしたので、それが機能することを知っています。lineEdits からの IP 取得部分も機能します。pSocket は Login クラスでプライベート メンバー (QTcpSocket *pSocket;) として宣言されます。

残念ながら、私は QT を初めて使用するので、「waitNextStep()」関数に何を含める必要があるのか​​よくわかりません。return 1 を実行しました。多くの例でそこにさまざまな機能があることに気付いたので、接続機能の SLOT についてはわかりません。

プログラムを実行すると、エラーは発生せず、プログラムは問題なく実行されます。しかし、ログイン ボタンを押すと、ダイアログ ボックスが約 15 秒間フリーズし、応答しなくなります。その後、「接続時にエラーが発生しました」というメッセージが表示されます。どんな助けでも大歓迎です。

4

1 に答える 1

0

残念ながら、私は QT を初めて使用するので、「waitNextStep()」関数に何を含める必要があるのか​​よくわかりません。return 1 を実行しました。多くの例でそこにさまざまな機能があることに気付いたので、接続機能の SLOT についてはわかりません。

ユースケースに大きく依存しますが、それは通常、受信データのハンドラーです。

プログラムを実行すると、エラーは発生せず、プログラムは問題なく実行されます。しかし、ログイン ボタンを押すと、ダイアログ ボックスが約 15 秒間フリーズし、応答しなくなります。その後、「接続時にエラーが発生しました」というメッセージが表示されます。どんな助けでも大歓迎です。

これはif(pSocket->waitForConnected())、非同期 Qt 操作のブロック (つまり、同期) の使用が原因です。代わりに、ドキュメントに従って接続された信号に接続することをお勧めします。

void QAbstractSocket::connected() [シグナル]

このシグナルは、connectToHost() が呼び出され、接続が正常に確立された後に発行されます。

注: 一部のオペレーティング システムでは、localhost への接続のために connectToHost() 呼び出しから connected() シグナルが直接送信される場合があります。

于 2014-01-11T20:34:28.163 に答える