IscanderChe
IscanderChe24 червня 2019 р. 09:11

QLocalSocket: правильное использование сигнала error()

В документации про использование сигнала error(QLocalSocket::LocalSocketError socketError) написано так:
"Note: Signal error is overloaded in this class. To connect to this signal by using the function pointer syntax, Qt provides a convenient helper for obtaining the function pointer as shown in this example:"

connect(localSocket, QOverload<QLocalSocket::LocalSocketError>::of(&QLocalSocket::error),
    [=](QLocalSocket::LocalSocketError socketError){ /* ... */ });

Поясните, пожалуйста, как правильно подключить слот slotError(QLocalSocket::LocalSocketError) согласно вышеприведённым рекомендациям, т.к. конструкция:

connect(localSocket, SIGNAL(error(QLocalSocket::LocalSocketError)), this, SLOT(slotError(QLocalSocket::LocalSocketError)));

по понятным причинам не работает...

Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Стабільний хостинг, на якому розміщується соціальна мережа EVILEG. Для проектів на Django радимо VDS хостинг.

Вам це подобається? Поділіться в соціальних мережах!

23
Evgenii Legotckoi
  • 24 червня 2019 р. 09:17

Добрый день.

Думаю, что это должно будет выглядеть вот так

connect(localSocket, QOverload<QLocalSocket::LocalSocketError>::of(&QLocalSocket::error), this, &YourClass::slotError);

Если в вашем классе нет перегрузки для slotError.

Подробнее о QOverload здесь

    Александр Панюшкин
    • 24 червня 2019 р. 09:19

    Добрый день.
    Думаю так: connect(localSocket, QOverload ::of(&QLocalSocket::error), this, &YourClass::slotError).
    Где YourClass - название вашего класса.

      IscanderChe
      • 24 червня 2019 р. 09:26

      Не сработало. Ошибка: "'template struct QOverload' used without template parameters
      connect(localSocket, QOverload::of(&QLocalSocket::error),
      ^".

        Evgenii Legotckoi
        • 24 червня 2019 р. 09:28

        Шаблонный параметр пропущен, сделайте так

        connect(localSocket, QOverload<QLocalSocket::LocalSocketError>::of(&QLocalSocket::error), this, &YourClass::slotError);
        
          Александр Панюшкин
          • 24 червня 2019 р. 09:28

          Посмотрите выше вариант Евгения.

            IscanderChe
            • 24 червня 2019 р. 09:29

            Перегрузки нет, но всё равно не работает.

              Александр Панюшкин
              • 24 червня 2019 р. 09:30

              У меня форматирование "съело" часть строки. :) Нужно было обернуть в код.

                Evgenii Legotckoi
                • 24 червня 2019 р. 09:32

                не собирается? или просто не работает?

                Покажите сигнатуру метода slotError

                  IscanderChe
                  • 24 червня 2019 р. 09:39

                  Просто оне работает.

                  // mylocalsocket.h
                  
                  private slots:
                      void slotError(QLocalSocket::LocalSocketError error);
                  
                  // mylocalsocket.cpp
                  
                  void MyLocalSocket::slotError(QLocalSocket::LocalSocketError error)
                  {
                      QMessageBox::warning(0, "Error", "Error server");
                      QString strError =
                          "Error: " + (error == QLocalSocket::ServerNotFoundError ?
                                       "The server was not found." :
                                       error == QLocalSocket::PeerClosedError ?
                                       "The server is closed." :
                                       error == QLocalSocket::ConnectionRefusedError ?
                                       "The connection was refused." :
                                       QString(localSocket->errorString()));
                      textEdit->append(strError);
                  }
                  
                    Evgenii Legotckoi
                    • 24 червня 2019 р. 09:44

                    Этот слот будет срабатывать только при наличии ошибки. Вы сейчас эмулируете возникновение данных ошибок?

                    Есть конечно дурацкое предположение, что стоит это через лямбду завернуть. Я уже сталкивался с такой ерундой у WebEngine.

                    connect(localSocket, QOverload<QLocalSocket::LocalSocketError>::of(&QLocalSocket::error),
                        [=](QLocalSocket::LocalSocketError socketError){ slotError(socketError); });
                    

                    Но мало вероятно, что причина в этом.

                      IscanderChe
                      • 24 червня 2019 р. 09:51

                      По идее, если я правильно понимаю, при незапущенном сервере должна отрабатываться ошибка QLocalSocket::ServerNotFoundError. Я пока не могу добиться, чтобы она отрабатывалась хотя бы. При этом при запущенном сервере сообщения отправляются нормально в обе стороны.

                        Evgenii Legotckoi
                        • 24 червня 2019 р. 10:00

                        Хочу уточнить для своей дотошливости.

                        Вот этот

                        QMessageBox::warning(0, "Error", "Error server");
                        

                        получается вообще не вызывается?

                          IscanderChe
                          • 24 червня 2019 р. 10:04

                          Не вызывается. Собственно, для проверки и поставил.
                          Да, в pro-файл добавил на всякий случай CONFIG += c++11, тоже не помогло.
                          После каждой правки на всякий случай провожу очистку проекта перед каждой компиляцией.

                            Александр Панюшкин
                            • 24 червня 2019 р. 10:06

                            И ещё вариант - попробовать постучаться куда-то, где гарантированно будет соединение отклонено (предположим, на 22 порт своей машины, если у вас закрыто ssh соединение).
                            Просто мне кажется, что ошибка о том, что сервер недоступен может быть сильно во времени растянута.

                              Evgenii Legotckoi
                              • 24 червня 2019 р. 10:07
                              • (відредаговано)

                              Я пока даже не знаю, а какой код самого подключения? использовали ожидание на подключение?

                              Так делали?

                              socket->connectToServer("market");
                              if (socket->waitForConnected(1000))
                                  qDebug("Connected!");
                              
                                IscanderChe
                                • 25 червня 2019 р. 02:26
                                • (відредаговано)
                                // mylocalsocket.h
                                
                                #ifndef MYLOCALSOCKET_H
                                #define MYLOCALSOCKET_H
                                
                                #include <QObject>
                                #include <QLocalSocket>
                                
                                class MyLocalSocket : public QObject
                                {
                                    Q_OBJECT
                                
                                public:
                                    MyLocalSocket();
                                
                                private:
                                    QLocalSocket* socket;
                                
                                private slots:
                                    void readError(QLocalSocket::LocalSocketError);
                                };
                                
                                #endif // MYLOCALSOCKET_H
                                
                                // mylocalsocket.cpp
                                
                                #include "mylocalsocket.h"
                                #include <QDebug>
                                #include <QtGlobal>
                                
                                MyLocalSocket::MyLocalSocket()
                                {
                                    socket = new QLocalSocket(this);
                                    socket->connectToServer("MyLocalServer");
                                    qDebug() << socket->state();
                                    qDebug() << socket->error();
                                
                                    connect(socket, QOverload<QLocalSocket::LocalSocketError>::of(&QLocalSocket::error), this, &MyLocalSocket::readError);
                                }
                                
                                void MyLocalSocket::readError(QLocalSocket::LocalSocketError)
                                {
                                    qDebug() << socket->error();
                                }
                                
                                

                                На другом ресурсе предлагают использовать такую конструкцию:

                                connect(ui.configCombo, static_cast<void(QComboBox::*)(int)>(&QComboBox::activated), this, &CDlgGeneral::selectionChanged);
                                

                                Я только не пойму, как её переписать для моего случая.

                                  Александр Панюшкин
                                  • 25 червня 2019 р. 02:30
                                  • Відповідь була позначена як рішення.

                                  Попробуйте строку 38 переместить после инициализации переменной socket.
                                  Т.е. до соединения с сервером.

                                    IscanderChe
                                    • 25 червня 2019 р. 02:34

                                    Получилось! Спасибо!!!

                                      Александр Панюшкин
                                      • 25 червня 2019 р. 02:36

                                      И вопрос не по теме вопроса (действительно интересно) - зачем вам подключать QtGlobal? Что это даёт?
                                      Просто я никогда его не использовал (и не знал о его существовании), да и QDebug вы подключаете напрямую.

                                        IscanderChe
                                        • 25 червня 2019 р. 02:39

                                        Это от безысходности. :)) Подумал, что раз QOverload описан в QtGlobal, надо его подключить, чтобы заработало...

                                          Александр Панюшкин
                                          • 25 червня 2019 р. 02:42

                                          Ааа... Ок. :)
                                          На будущее - я для себя понял следующее - все коннекты прописываю сразу после инициализации.
                                          А то была пару раз ошибка - множественного подключения коннекта (коннект прописывал в функции, которая вызывалась несколько раз). В итоге это приводит к множественному вызову сигнала.
                                          Ну, так... из разряда по-умничать. :)

                                            IscanderChe
                                            • 25 червня 2019 р. 03:01

                                            Интересно, почему тогда для QTcpSocket коннект нормально работает после соединения с сервером? По идее-то вроде похожие классы...

                                              Александр Панюшкин
                                              • 25 червня 2019 р. 03:07

                                              Возможно здесь (socket->connectToServer("MyLocalServer");) ошибка наступает в момент вызова функции, поэтому к моменту создания связи коннектом уже просто нечего обрабатывать.
                                              Вероятнее всего для QLocalSocket по-умолчанию происходит ожидание всех действий (или выполнение в основном потоке), в то время как QTcpSocket отправляет всю свою работу в отдельный поток.

                                                Коментарі

                                                Only authorized users can post comments.
                                                Please, Log in or Sign up
                                                AD

                                                C++ - Тест 004. Указатели, Массивы и Циклы

                                                • Результат:50бали,
                                                • Рейтинг балів-4
                                                m
                                                • molni99
                                                • 26 жовтня 2024 р. 01:37

                                                C++ - Тест 004. Указатели, Массивы и Циклы

                                                • Результат:80бали,
                                                • Рейтинг балів4
                                                m
                                                • molni99
                                                • 26 жовтня 2024 р. 01:29

                                                C++ - Тест 004. Указатели, Массивы и Циклы

                                                • Результат:20бали,
                                                • Рейтинг балів-10
                                                Останні коментарі
                                                ИМ
                                                Игорь Максимов22 листопада 2024 р. 11:51
                                                Django - Підручник 017. Налаштуйте сторінку входу до Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
                                                Evgenii Legotckoi
                                                Evgenii Legotckoi31 жовтня 2024 р. 14:37
                                                Django - Урок 064. Як написати розширення для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
                                                A
                                                ALO1ZE19 жовтня 2024 р. 08:19
                                                Читалка файлів fb3 на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                                                ИМ
                                                Игорь Максимов05 жовтня 2024 р. 07:51
                                                Django - Урок 064. Як написати розширення для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                                                d
                                                dblas505 липня 2024 р. 11:02
                                                QML - Урок 016. База даних SQLite та робота з нею в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                                                Тепер обговоріть на форумі
                                                Evgenii Legotckoi
                                                Evgenii Legotckoi24 червня 2024 р. 15:11
                                                добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
                                                t
                                                tonypeachey115 листопада 2024 р. 06:04
                                                google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
                                                NSProject
                                                NSProject04 червня 2022 р. 03:49
                                                Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
                                                9
                                                9Anonim25 жовтня 2024 р. 09:10
                                                Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

                                                Слідкуйте за нами в соціальних мережах