Pergunta

Estou tentando criar um cliente que deve se conectar a um servidor C.Devo usar TCP.Já tenho um servidor totalmente funcional, mas não consigo conectar meu cliente.Não quero enviar nenhum dado ao servidor (neste momento).Só quero estabelecer uma conexão e abrir uma nova caixa de diálogo.

Aqui está o código no slot Void Login::on_pushButton_clicked().// pushButon é meu botão de login

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"));
}

Já defini a classe Menu e sei que está funcional pois testei sem a parte de conexão.A parte de busca de IP do lineEdits também é funcional.O pSocket é declarado na classe Login, como um membro privado (QTcpSocket *pSocket;).

Infelizmente, sou novo no QT e realmente não sei o que a função 'waitNextStep ()' deve conter.Acabei de fazer um retorno 1;Não tenho certeza sobre o SLOT na função de conexão, pois notei em muitos exemplos que havia funções diferentes ali.

Se eu executar o programa, não recebo erros e o programa é executado perfeitamente.Mas quando clico no botão de login, a caixa de diálogo congela por cerca de 15 segundos - ela não responde.Depois disso, recebo a mensagem 'Erro ao conectar'.Qualquer ajuda será muito apreciada.

Foi útil?

Solução

Infelizmente, sou novo no QT e realmente não sei o que a função 'waitNextStep ()' deve conter.Acabei de fazer um retorno 1;Não tenho certeza sobre o SLOT na função de conexão, pois notei em muitos exemplos que havia funções diferentes ali.

Depende muito do seu caso de uso, mas geralmente é o manipulador dos dados recebidos, o que você deseja fazer com eles, incluindo potencialmente armazená-los em uma variável de membro no momento.

Se eu executar o programa, não recebo erros e o programa é executado perfeitamente.Mas quando clico no botão de login, a caixa de diálogo congela por cerca de 15 segundos - ela não responde.Depois disso, recebo a mensagem 'Erro ao conectar'.Qualquer ajuda será muito apreciada.

É porque if(pSocket->waitForConnected()) é o bloqueio (ou seja,sync) uso da operação assíncrona do Qt.O que eu sugeriria fazer é conectar-se ao sinal conectado conforme documentação:

void QAbstractSocket::connected() [sinal]

Este sinal é emitido após connectToHost() ter sido chamado e uma conexão ter sido estabelecida com sucesso.

Observação:Em alguns sistemas operacionais, o sinal conectado() pode ser emitido diretamente da chamada connectToHost() para conexões com o host local.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top