IscanderChe
IscanderChe24 июня 2019 г. 9: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 г. 9:17

Добрый день.

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

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

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

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

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

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

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

        Evgenii Legotckoi
        • 24 июня 2019 г. 9:28

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

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

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

            IscanderChe
            • 24 июня 2019 г. 9:29

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

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

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

                Evgenii Legotckoi
                • 24 июня 2019 г. 9:32

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

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

                  IscanderChe
                  • 24 июня 2019 г. 9: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 г. 9:44

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

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

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

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

                      IscanderChe
                      • 24 июня 2019 г. 9: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 г. 2: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 г. 2:30
                                  • Ответ был помечен как решение.

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

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

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

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

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

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

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

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

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

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

                                                Комментарии

                                                Только авторизованные пользователи могут публиковать комментарии.
                                                Пожалуйста, авторизуйтесь или зарегистрируйтесь
                                                e
                                                • ehot
                                                • 31 марта 2024 г. 14:29

                                                C++ - Тест 003. Условия и циклы

                                                • Результат:78баллов,
                                                • Очки рейтинга2
                                                B

                                                C++ - Тест 002. Константы

                                                • Результат:16баллов,
                                                • Очки рейтинга-10
                                                B

                                                C++ - Тест 001. Первая программа и типы данных

                                                • Результат:46баллов,
                                                • Очки рейтинга-6
                                                Последние комментарии
                                                k
                                                kmssr8 февраля 2024 г. 18:43
                                                Qt Linux - Урок 001. Автозапуск Qt приложения под Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
                                                АК
                                                Анатолий Кононенко5 февраля 2024 г. 1:50
                                                Qt WinAPI - Урок 007. Работаем с ICMP Ping в Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
                                                EVA
                                                EVA25 декабря 2023 г. 10:30
                                                Boost - статическая линковка в CMake проекте под Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
                                                J
                                                JonnyJo25 декабря 2023 г. 8:38
                                                Boost - статическая линковка в CMake проекте под Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
                                                G
                                                Gvozdik18 декабря 2023 г. 21:01
                                                Qt/C++ - Урок 056. Подключение библиотеки Boost в Qt для компиляторов MinGW и MSVC Для решения твой проблемы добавь в файл .pro строчку "LIBS += -lws2_32" она решит проблему , лично мне помогло.
                                                Сейчас обсуждают на форуме
                                                a
                                                a_vlasov14 апреля 2024 г. 6:41
                                                Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Евгений, добрый день! Такой вопрос. Верно ли следующее утверждение: Любое Android-приложение, написанное на Java/Kotlin чисто теоретически (пусть и с большими трудностями) можно написать и на C+…
                                                Павел Дорофеев
                                                Павел Дорофеев14 апреля 2024 г. 2:35
                                                QTableWidget с 2 заголовками Вот тут есть кастомный QTableView с многорядностью проект поддерживается, обращайтесь
                                                f
                                                fastrex4 апреля 2024 г. 4:47
                                                Вернуть старое поведение QComboBox, не менять индекс при resetModel Добрый день! У нас много проектов в которых используется QComboBox, в версии 5.5.1, когда модель испускает сигнал resetModel, currentIndex не менялся. В версии 5.15 при resetModel происходит try…
                                                P
                                                Pisych27 февраля 2023 г. 4:04
                                                Как получить в массив значения из связанной модели? Спасибо, разобрался:))
                                                AC
                                                Alexandru Codreanu19 января 2024 г. 11:57
                                                QML Обнулить значения SpinBox Доброго времени суток, не могу разобраться с обнулением значение SpinBox находящего в делегате. import QtQuickimport QtQuick.ControlsWindow { width: 640 height: 480 visible: tr…

                                                Следите за нами в социальных сетях