【问题标题】:Connect to WebSocket server from Qt UI with Echo Client Example使用 Echo 客户端示例从 Qt UI 连接到 WebSocket 服务器
【发布时间】:2015-04-08 07:24:52
【问题描述】:

我在 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 文件。

主要问题是当我按下表单上的按钮时无法连接到服务器。但是,我看到调试消息 “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.

【问题讨论】:

    标签: c++ qt websocket


    【解决方案1】:

    在您的 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 对象的类似循环。

    您可能必须考虑何时要销毁它,可能是通过“重置”按钮例程。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-13
      • 1970-01-01
      • 1970-01-01
      • 2022-06-27
      • 2020-12-11
      • 2019-05-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多