Дмитрий
Nov. 9, 2021, 7:46 p.m.

Сигнал QTcpSocket::readyRead()

signals, QTcpSocket

Всем привет.
Есть класс, в котором есть объект класса, работающий с QTcpSocket. Этот класс создается в main():

  1. int main(int argc, char *argv[])
  2. {
  3. QCoreApplication a(argc, argv);
  4. MController mc;
  5. mc.set_ip(ip);
  6. mc.set_password(password);
  7. mc.set_data_for_send(packet);
  8. mc.start();
  9. return a.exec();
  10. }

В методе start() создается объект для работы с сокетом, осуществляется соединение и при успешном коннекте в сокет отправляются нужные данные.
Но сигнал QTcpSocket::readyRead() не емитится и привязанный к нему слот не вызывается.
Посмотрел в Wireshark - данные уходят и приходит ответ.
Сам метод start() (выкинул то, что не имеет отношения к делу):

  1. void MController::start()
  2. {
  3. constexpr uint16_t port = 2222;
  4. device_connector = std::make_unique<TCP_Connector>(ip_, port);
  5.  
  6. device_connector->connect_to_device();
  7. dynamic_cast<TCP_Connector*>(device_connector.get())->wait_ready_read();
  8. }
  9.  

В конец метода вставил

  1. dynamic_cast<TCP_Connector*>(device_connector.get())->wait_ready_read();

в нем происходит:

  1. tcp_->waitForReadyRead(4000);

После этого сигнал срабатывает один раз. по приему данных отправляю следующие данные, и ответа опять нет.
Думаю, что что-то связано с циклом обработки событий, но не пойму как сделать так, чтобы соединение создавалось после запуска этого цикла обработки событий.
Причем есть подобный код, но с графикой - там проблем нет. Но там коннект по кнопке осуществляется.
Как заставить работать нормально сигналы и слоты? Что-то затупил малость.

2

Do you like it? Share on social networks!

3
Дмитрий
  • Nov. 9, 2021, 7:47 p.m.

Да - пробовал еще QTimer создать, но он тоже не срабатывает.

    Docent
    • Nov. 9, 2021, 8:24 p.m.

    "После этого сигнал срабатывает один раз" - один раз и должен был сработать до вызова обработчика событий;
    "readyRead() не емитится и привязанный к нему слот не вызывается" - этого и не видно в представленном коде;

      Дмитрий
      • Nov. 9, 2021, 8:34 p.m.

      "этого и не видно в представленном коде;" - это внутренности MController. Во внутренностях этот коннект есть

        Comments

        Only authorized users can post comments.
        Please, Log in or Sign up
        • Last comments
        • AK
          April 1, 2025, 11:41 a.m.
          Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
        • Evgenii Legotckoi
          March 9, 2025, 9:02 p.m.
          К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
        • VP
          March 9, 2025, 4:14 p.m.
          Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
        • ИМ
          Nov. 22, 2024, 9:51 p.m.
          Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
        • Evgenii Legotckoi
          Oct. 31, 2024, 11:37 p.m.
          Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup