IscanderChe
IscanderChe24. Juni 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
Stabiles Hosting des sozialen Netzwerks EVILEG. Wir empfehlen VDS-Hosting für Django-Projekte.

Magst du es? In sozialen Netzwerken teilen!

23
Evgenii Legotckoi
  • 24. Juni 2019 09:17

Добрый день.

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

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

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

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

    Добрый день.
    Думаю так: 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. Juni 2019 09:28

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

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

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

            IscanderChe
            • 24. Juni 2019 09:29

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

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

                Evgenii Legotckoi
                • 24. Juni 2019 09:32

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

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

                  IscanderChe
                  • 24. Juni 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. Juni 2019 09:44

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

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

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

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

                      IscanderChe
                      • 24. Juni 2019 09:51

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

                        Evgenii Legotckoi
                        • 24. Juni 2019 10:00

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

                        Вот этот

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

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

                          IscanderChe
                          • 24. Juni 2019 10:04

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

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

                              Evgenii Legotckoi
                              • 24. Juni 2019 10:07
                              • (bearbeitet)

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

                              Так делали?

                              socket->connectToServer("market");
                              if (socket->waitForConnected(1000))
                                  qDebug("Connected!");
                              
                                IscanderChe
                                • 25. Juni 2019 02:26
                                • (bearbeitet)
                                // 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. Juni 2019 02:30
                                  • Die Antwort wurde als Lösung markiert.

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

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

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

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

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

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

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

                                                Kommentare

                                                Nur autorisierte Benutzer können Kommentare posten.
                                                Bitte Anmelden oder Registrieren
                                                Letzte Kommentare
                                                A
                                                ALO1ZE19. Oktober 2024 15:19
                                                Fb3-Dateileser auf Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                                                ИМ
                                                Игорь Максимов5. Oktober 2024 14:51
                                                Django – Lektion 064. So schreiben Sie eine Python-Markdown-Erweiterung Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                                                d
                                                dblas55. Juli 2024 18:02
                                                QML - Lektion 016. SQLite-Datenbank und das Arbeiten damit in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                                                k
                                                kmssr9. Februar 2024 02:43
                                                Qt Linux - Lektion 001. Autorun Qt-Anwendung unter Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
                                                Qt WinAPI - Lektion 007. Arbeiten mit ICMP-Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
                                                Jetzt im Forum diskutieren
                                                J
                                                JacobFib17. Oktober 2024 10:27
                                                добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
                                                JW
                                                Jhon Wick1. Oktober 2024 22:52
                                                Indian Food Restaurant In Columbus OH| Layla’s Kitchen Indian Restaurant If you're looking for a truly authentic https://www.laylaskitchenrestaurantohio.com/ , Layla’s Kitchen Indian Restaurant is your go-to destination. Located at 6152 Cleveland Ave, Colu…
                                                КГ
                                                Кирилл Гусарев27. September 2024 16:09
                                                Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
                                                F
                                                Fynjy22. Juli 2024 11:15
                                                при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

                                                Folgen Sie uns in sozialen Netzwerken