Qt5 подключить ошибку "Нет такого слота"

Я проверил другие подобные вопросы и попробовал их решения, но они не работают для меня.

Я в основном пытаюсь сделать http-клиент, который только делает почтовые запросы. Для этого мне нужно подключить QNetworkManager готовый сигнал к некоторому слоту обратного вызова.

Вот мой код.

h файл:

...
public slots:
   void finishedSlot(QNetworkReply* reply);
private:
    QNetworkAccessManager *network_manager;
...

Файл cpp:

...
Class1::Class1(){
    network_manager = new QNetworkAccessManager(this);
    QObject::connect(network_manager, SIGNAL(finished(QNetworkReply *)), this, SLOT(finishedSlot(QNetworkReply *)));
}
...
void Class1::finishedSlot(QNetworkReply* reply)
{
    // some logic with reply
}
...

Как вы можете видеть, слот определенно присутствует и объявлен в общедоступных слотах в файле заголовка. Поэтому я понятия не имею, почему это происходит. Я уже пробовал очистить, запустил qmake и перестроил.

Сообщение об ошибке: "QObject:: connect: нет такого слота QObject:: finishedSlot (QNetworkReply *)"

Любая идея?

Ответы

Ответ 1

Вероятно, вы забыли использовать макрос Q_OBJECT. Каждый класс, который реализует свои собственные слоты/сигналы, нуждается в этом макросе. Не забывайте, что вам нужно добавить файл заголовка/исходного файла в файл .pro.

Ответ 2

Одно замечание; поскольку вы используете Qt 5, есть новый синтаксис соединения слота сигнала, который позволит вам указать любую функцию, а не только те, которые определены как слоты.

В этой ситуации вы можете сделать следующее: -

connect(network_manager, &QNetworkAccessManager::finished, this, &Class1::finishedSlot);

Что хорошего в этом синтаксисе, так это то, что вы просто указываете адрес функции и не беспокоитесь о параметрах, поэтому, если вы меняете их в функции, вам не нужно обновлять их в операторах связи.

Вы все равно должны использовать макрос Q_OBJECT, и вы можете больше узнать о новом синтаксисе здесь.

Ответ 3

Вероятно, вы забыли использовать макрос Q_OBJECT. Каждый класс, который реализует свои собственные слоты/сигналы, нуждается в этом макросе. Не забывайте, что вам нужно добавить файл заголовка/исходного файла в файл .pro.

Как и после этих шагов, я получал некоторую ошибку в отношении "vtable не создан..." для соответствующего класса, а затем я изменил иерархию HEADERS += и SOURCES +=, так как

HEADERS +=\
SOURCES +=

Ну, проблема решена. Но я не понял причину этого. Любой мог бы просветить это отношение connect() с помощью Q_OBJECT, moc_*file с *.pro файлами (как генерируются эти про файлы).

У меня было понимание, что он анализирует *.pro как теги (SOURCES, HEADER, CONFIG и т.д.), но в этом случае почему иерархия создаст проблему?