使用 Echo 客户端示例从 Qt UI 连接到 WebSocket 服务器

Connect to WebSocket server from Qt UI with Echo Client Example

我在 CLI 中使用 Websocket Echo Server Example,它工作正常。我正在尝试从我的 Qt GUI 项目连接到此服务器。我有 MainWindow class 和适当的插槽

void MainWindow::on_pushButton_clicked()
{
    qDebug() << "Push btn clicked";
    EchoClient client(QUrl(QStringLiteral("ws://localhost:1234")));
}

和来自 CLI 的 EchoClient 文件 Websocket Echo Client Example

主要问题是当我按下表单上的按钮时无法连接到服务器。但是,我看到调试消息 "Push btn clicked"。它应该打印 "Hello, world!"。但是没有任何反应,没有错误。即使信号 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.

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

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

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 对象的 like 循环。

可能你必须考虑何时要销毁它,可能是通过 "reset" 按钮例程。

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