Клиент Qt - подключиться к серверу C

Я пытаюсь создать клиент, который должен подключаться к серверу C. Я должен использовать TCP. У меня уже есть сервер, который полностью функционален, но я не могу подключить свой клиент. Я не хочу отправлять какие-либо данные на сервер (на данный момент). Я просто хочу установить соединение и открыть новое диалоговое окно.

Вот код в слоте Void Login::on_pushButton_clicked(). // pushButon — моя кнопка входа

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

Я уже определил класс Menu и знаю, что он функционален, так как тестировал его без соединения. Часть получения IP-адреса из lineEdits также работает. pSocket объявлен в классе Login как частный член (QTcpSocket *pSocket;).

К сожалению, я новичок в QT, и я действительно не знаю, что должна содержать функция 'waitNextStep()'. Я только что сделал return 1; Я не уверен насчет SLOT в функции подключения, так как во многих примерах я заметил, что там были разные функции.

Если я запускаю программу, я не получаю никаких ошибок, и программа выполняется просто отлично. Но когда я нажимаю кнопку входа в систему, диалоговое окно зависает примерно на 15 секунд - оно не отвечает. После этого я получаю сообщение «Ошибка при подключении». Любая помощь будет высоко ценится.


person KupiKupi    schedule 11.01.2014    source источник
comment
К сожалению, я новичок в QT, и я действительно не знаю, что должна содержать функция 'waitNextStep()'. -› Ну, это не вопрос Qt. Это вопрос прецедента, который вы должны знать.   -  person lpapp    schedule 12.01.2014
comment
Я знаю, что мне нужно многому научиться, но это срочный проект, поэтому я просто получаю как можно больше информации из руководств и примеров. Я не могу читать и впитывать документацию прямо сейчас. Спасибо за ответ в любом случае   -  person KupiKupi    schedule 12.01.2014
comment
Похоже на обычную проблему управления проектами, в которую люди легко попадают: сделать, сделать, не оценить, сколько работы для этого потребуется. В любом случае, я не осуждал ваши навыки работы с Qt, а говорил о том, что мы недостаточно хорошо знаем вариант использования и, следовательно, что именно нужно делать в этом методе, поэтому мы можем давать только общие подсказки без дальнейших разъяснений.   -  person lpapp    schedule 12.01.2014


Ответы (1)


К сожалению, я новичок в QT, и я действительно не знаю, что должна содержать функция 'waitNextStep()'. Я только что сделал return 1; Я не уверен насчет SLOT в функции подключения, так как во многих примерах я заметил, что там были разные функции.

Это сильно зависит от вашего варианта использования, но обычно это обработчик входящих данных, что бы вы ни хотели с ними делать, потенциально включая то, что вы просто сохраняете их в переменной-члене на данный момент.

Если я запускаю программу, я не получаю никаких ошибок, и программа выполняется просто отлично. Но когда я нажимаю кнопку входа в систему, диалоговое окно зависает примерно на 15 секунд - оно не отвечает. После этого я получаю сообщение «Ошибка при подключении». Любая помощь будет высоко ценится.

Это потому, что if(pSocket->waitForConnected()) - это блокирующее (т.е. синхронизирующее) использование асинхронной операции Qt. Вместо этого я бы предложил подключиться к подключенному сигналу в соответствии с документация:

void QAbstractSocket::connected() [сигнал]

Этот сигнал испускается после вызова connectToHost() и успешного установления соединения.

Примечание. В некоторых операционных системах сигнал connect() может быть отправлен непосредственно из вызова connectToHost() для подключения к локальному хосту.

person lpapp    schedule 11.01.2014
comment
Слушай, я просто не могу заставить это работать. Вы должны быть немного более конкретным в том, что я должен делать. Я несколько раз модифицировал код и пытался использовать подключенный сигнал, но без шансов... Заранее спасибо - person KupiKupi; 12.01.2014
comment
@KupiKupi: боюсь, это не сайт для домашней работы, особенно без четких вариантов использования, ошибок и т. д. Попробуйте объяснить, что ваши менеджеры, призывающие вас, никому не помогут в этой ситуации. Это принесет больше вреда, чем помощи. - person lpapp; 12.01.2014
comment
Единственный возможный вред в этой ситуации — не выполнить проект вовремя. И это не имеет никакого отношения к моей работе. «Вместо этого я бы предложил подключиться к подключенному сигналу в соответствии с документацией:». В документации нет объяснения, как это сделать. - person KupiKupi; 12.01.2014
comment
@KupiKupi: вам нужно иметь минимальное представление об этом сайте. Давление на людей, пишущих для вас рабочий код, не по теме. Вы должны приложить некоторые усилия. Боюсь, я не буду бесплатной домашней работой для такого плохо управляемого проекта, и это не является целью сайта в моем понимании. Я рад помочь людям, которые хотят учиться ради удовольствия, прочитав документацию и получив минимальное понимание. - person lpapp; 12.01.2014
comment
Но я читал документы. И я не думаю, что это так уж плохо управляется. Попробуй стать мной на секунду. Наличие большого давления на ваши плечи затрудняет обучение. У меня не было недель, чтобы завершить этот проект. Всего 1 неделя. А у меня еще 2 дня. Я не вижу веселья в этой ситуации. В любом случае это ваше решение, но я не просил вас писать код. Просто чтобы быть немного более конкретным. - person KupiKupi; 12.01.2014
comment
Это базовый вызов соединения, аналогичный тому, который уже есть в вашем коде. Это заставляет меня думать, что код был скопирован/вставлен без понимания, поэтому: connect (pSocket, SIGNAL(connected()), SLOT(handleConnected())); и подключиться (pSocket, SIGNAL(error()), SLOT(handleError())); - person lpapp; 12.01.2014
comment
Немного покопавшись, я пришел к выводу. Мой handdleConnected будет вызван, как только будет установлено соединение. Я удалил часть If. В функции handleConnected я написал необходимый код, чтобы открыть следующее диалоговое окно. Теперь программа не зависает. Однако он ничего не делает, когда я нажимаю на вход - person KupiKupi; 12.01.2014