June 24, 2019, 9:11 a.m.

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)));

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

We recommend hosting TIMEWEB
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.
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

Comments

Only authorized users can post comments.
Please, Log in or Sign up
AD
July 19, 2019, 9:51 a.m.
Anastasia Dutchina

C++ - Test 001. The first program and data types

  • Result:53points,
  • Rating points-4
AD
July 19, 2019, 9:46 a.m.
Anastasia Dutchina

Qt - Test 001. Signals and slots

  • Result:57points,
  • Rating points-2
DZ
July 19, 2019, 5:01 a.m.
Damira Zholdasbay

C ++ - Test 004. Pointers, Arrays and Loops

  • Result:60points,
  • Rating points-1
Last comments
July 19, 2019, 3:29 p.m.
IscanderChe

Спасибо, уже разобрался по оригинальной статье на GitHub, всё заработало. Я просто хотел мягко намекнуть, что без этой информации ваша статья явно неполная.
July 19, 2019, 3:16 p.m.
Ruslan Polupan

Вот ссылка по работе с ключами и GitHub https://exlmoto.ru/git-and-qt-creator/#31 Сгенерируй новый ключ и добваь его на GitHub.
July 19, 2019, 3:03 p.m.
IscanderChe

В какой статье? Какой ключ? Как добавить? Ничего не понятно. :) Если из этой , то как понять, какой дефолтный у меня агент SSH.
July 19, 2019, 1:43 p.m.
Ruslan Polupan

Ключ не верный или не действительный. сформируй новый и добавь на GitHub В статье описапно как сделать.
July 19, 2019, 12:55 p.m.
IscanderChe

У меня ошибка случилась ещё до Qt Creator, я ж написал. На этапе загрузки проекта из командной строки на GitHub.
Now discuss on the forum
July 19, 2019, 10:55 a.m.
Mihailll

Да. Там похоже каждое устройство генерирует свой токен, этот токен нужно как то получать и использовать в запросе. Но как это делать я пока не понял.
July 19, 2019, 10:52 a.m.
Mihailll

Суть понятна, но не понятно где и как это использовать. Как я понимаю для начала нужно получить координату на поле и находящийся эллемент на этой координате в этой части кода void Mov...
July 19, 2019, 9:31 a.m.
Mihailll

Добрый день. Повернул ListView в горизонтальное положение. При прокрутке эллементы выстраиваются у левого края окна. Как в QMK в ListView сделать центрирование по центру? ...
b
July 18, 2019, 2:27 a.m.
bbb116

Когда отрисовки не видно, объекты AreaSelector создаются (при нажатии и движении мышкой), но почему то не срабатывает paint() у них, хотя делаю update этой области. Причем эти области мо...
July 17, 2019, 5:54 a.m.
Aleksej Vnukov

хочу не стандартный набор символов, а все ненужное убрать чтоб не мешало. для начала решил посмотреть как работает клава на родном примере, а он на телефоне не взлетел вот и начал разби...
Looking for a Job?
25,000.00 руб. - 30,000.00 руб.
Разработчик Qt/C++
Barnaul, Altai Krai, Russia

For registered users on the site there is a minimum amount of advertising

EVILEG
About
Services
Join us
© EVILEG 2015-2019
Recommend hosting TIMEWEB