24 июня 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)));

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

Возврат 10% от суммы заказа отеля на Booking
Возврат 10% от суммы заказа отеля на Booking
Предлагаем ссылку с 10% возвратом от суммы заказа при бронировании отеля через Booking
23

Добрый день.

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

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

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

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

0

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

0

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

0

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

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

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

0

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

0

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

0

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

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

0

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

// 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);
}
0

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

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

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

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

0

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

0

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

Вот этот

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

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

0

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

0

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

0

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

Так делали?

socket->connectToServer("market");
if (socket->waitForConnected(1000))
    qDebug("Connected!");
0
// 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);

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

0

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

1

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

0

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

0

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

0

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

2

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

0

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

1

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
АС
22 июля 2019 г. 16:32
Александр Спиридонов

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

  • Результат:46баллов,
  • Очки рейтинга-6
АС
22 июля 2019 г. 16:21
Александр Спиридонов

Qt - Тест 001. Сигналы и слоты

  • Результат:73баллов,
  • Очки рейтинга1
22 июля 2019 г. 10:00
Pavel K.

C++ - Тест 006. Перечисления

  • Результат:50баллов,
  • Очки рейтинга-4
Последние комментарии
21 июля 2019 г. 6:03
Евгений Легоцкой

да, наверное, 32-х разрядную поддержку уже давно поа было выкинуть. К слову, у вас много проектов под Android? Часто много где вижу вопросы о том, пишет ли кто-то вообще на Qt под мобильные сист…
20 июля 2019 г. 14:41
Андрей Янкович

Очень полезная информация, увы уже выкинул поддержку 32 битных бедняг.
20 июля 2019 г. 9:31
Михаиллл

Вот так qDebug()<<"position:"<<event->scenePos();
20 июля 2019 г. 8:49
Михаиллл

Добрый день. Как можно узнать координату на графической сцене при отпускании клавиши мыши?
Сейчас обсуждают на форуме
22 июля 2019 г. 10:50
Pavel K.

Благодарю.Буду пробовать.
22 июля 2019 г. 10:10
Pavel K.

Скорее всего в коде не правильно потоки используются. на форуме пишут кое что интересное - https://stackoverflow.com/questions/18112027/qt-5-1-qml-property-through-threads
22 июля 2019 г. 3:58
Евгений Легоцкой

Добрый день! Нужен совет сообщества по разработке функционала проверки орфографии. Одна из идей - добавить проверку орфографии при наборе текста статей. Полагаю, что наиболее аде…
22 июля 2019 г. 3:01
Евгений Легоцкой

Возможно, если при сохранении файла установить права доступа на файл. Что-то такое должно быть у QFile
Ищу работу?
5,000.00 руб. - 15,000.00 руб.
Дизайнер
Moskovskiy, Moscow, Russia
25,000.00 руб. - 30,000.00 руб.
Разработчик Qt/C++
Barnaul, Altai Krai, Russia

Для зарегистрированных пользователей на сайте присутствует минимальное количество рекламы

EVILEG
О нас
Услуги
Присоединяйтесь к нам
© EVILEG 2015-2019
Рекомендует хостинг TIMEWEB