Сигнал QTcpSocket::readyRead()
Всем привет.
Есть класс, в котором есть объект класса, работающий с QTcpSocket. Этот класс создается в main():
int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); MController mc; mc.set_ip(ip); mc.set_password(password); mc.set_data_for_send(packet); mc.start(); return a.exec(); }
В методе start() создается объект для работы с сокетом, осуществляется соединение и при успешном коннекте в сокет отправляются нужные данные.
Но сигнал QTcpSocket::readyRead() не емитится и привязанный к нему слот не вызывается.
Посмотрел в Wireshark - данные уходят и приходит ответ.
Сам метод start() (выкинул то, что не имеет отношения к делу):
void MController::start() { constexpr uint16_t port = 2222; device_connector = std::make_unique<TCP_Connector>(ip_, port); device_connector->connect_to_device(); dynamic_cast<TCP_Connector*>(device_connector.get())->wait_ready_read(); }
В конец метода вставил
dynamic_cast<TCP_Connector*>(device_connector.get())->wait_ready_read();
в нем происходит:
tcp_->waitForReadyRead(4000);
После этого сигнал срабатывает один раз. по приему данных отправляю следующие данные, и ответа опять нет.
Думаю, что что-то связано с циклом обработки событий, но не пойму как сделать так, чтобы соединение создавалось после запуска этого цикла обработки событий.
Причем есть подобный код, но с графикой - там проблем нет. Но там коннект по кнопке осуществляется.
Как заставить работать нормально сигналы и слоты? Что-то затупил малость.
Рекомендуємо хостинг TIMEWEB
Стабільний хостинг, на якому розміщується соціальна мережа EVILEG. Для проектів на Django радимо VDS хостинг.Вам це подобається? Поділіться в соціальних мережах!
- Akiv Doros
- 11 листопада 2024 р. 14:58
C++ - Тест 004. Указатели, Массивы и Циклы
- Результат:50бали,
- Рейтинг балів-4
- molni99
- 26 жовтня 2024 р. 01:37
C++ - Тест 004. Указатели, Массивы и Циклы
- Результат:80бали,
- Рейтинг балів4
- molni99
- 26 жовтня 2024 р. 01:29
C++ - Тест 004. Указатели, Массивы и Циклы
- Результат:20бали,
- Рейтинг балів-10
Да - пробовал еще QTimer создать, но он тоже не срабатывает.
"После этого сигнал срабатывает один раз" - один раз и должен был сработать до вызова обработчика событий;
"readyRead() не емитится и привязанный к нему слот не вызывается" - этого и не видно в представленном коде;
"этого и не видно в представленном коде;" - это внутренности MController. Во внутренностях этот коннект есть