使用Echo Client Example从Qt UI连接到WebSocket服务器

时间:2015-04-08 07:24:53

标签: c++ qt websocket

我在CLI中使用Websocket Echo Server Example并且工作正常。我试图从我的Qt GUI项目连接到这个服务器。我有一个带有适当插槽的MainWindow类

void MainWindow::on_pushButton_clicked()
{
    qDebug() << "Push btn clicked";
    EchoClient client(QUrl(QStringLiteral("ws://localhost:1234")));
}
来自CLI Websocket Echo Client Example

和EchoClient文件。

主要问题是,当我在表单上按下按钮时,我无法连接到服务器。但是,我看到调试消息&#34;按btn点击&#34; 。它应该被打印出来&#34; Hello,world!&#34;。但没有任何反应,没有错误。即使信号void EchoClient::onConnected()也没有被解雇。

但如果我将EchoClient client(QUrl(QStringLiteral("ws://localhost:1234")));移动到main.cpp,它会连接:

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    EchoClient client(QUrl(QStringLiteral("ws://localhost:1234")));
    return a.exec();
}

我是C ++和Qt的新手。 为什么会这样?它是否与UI中的处理线程有关?我应该知道什么?

Qt 5.4。

1 个答案:

答案 0 :(得分:2)

在您的on_pushButton_clicked()函数内部,您正在函数堆栈中创建EchoClient(它是异步的)。一旦函数退出,EchoClient对象就会从堆栈中销毁。

您可以考虑不同的解决方案,例如在MainWindow类中创建私有字段

private EchoClient *client;

然后在MainWindow构造函数中将其设置为null:

this->client = NULL;

并且仅在此时在click()例程中执行类似的操作:

void MainWindow::on_pushButton_clicked()
{
    qDebug() << "Push btn clicked";
    if (this->client == NULL)
    {
        this->client = new EchoClient(QUrl(QStringLiteral("ws://localhost:1234")));
    }
    else
        qWarning() << "Carefull, the client is already running";
}

然后由您来处理您创建的client对象的类似循环。

可能你必须考虑什么时候想要销毁它,可能是通过&#34;重置&#34;按钮例程。

我建议阅读:http://doc.qt.io/qt-4.8/qapplication.html#details