我在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。
答案 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;按钮例程。