QT ищет слот в неправильном классе - PullRequest
0 голосов
/ 03 ноября 2018

У меня есть отдельный класс для выполнения запроса GET с использованием QNetwork, показанного ниже.

Заголовок запроса:

#ifndef REQUEST_H
#define REQUEST_H

#include <QUrl>
#include <QObject>

class Request : public QObject
{
    Q_OBJECT

public:
    void make_request(QUrl url, const char* slot);
};

#endif // REQUEST_H

Источник запроса:

#include "request.h"
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QNetworkRequest>

void Request::make_request(const QUrl url, const char* slot)
{
    QNetworkAccessManager* manager = new QNetworkAccessManager();
    connect(manager, SIGNAL(finished(QNetworkReply*)), this, slot);

    QNetworkReply* reply = manager->get(QNetworkRequest(url));
}

Я запустил эту функцию в своем классе MainWindow, выполнив следующее.

request.make_request(QUrl("{ApiUrl}"), SLOT(parse_trending(QNetworkReply*)));

Однако выдает ошибку QObject::connect: No such slot Request::parse_trending(QNetworkReply*) in {MainWindow}

Мне добавили макрос Q_OBJECT в мои заголовочные файлы, но я все еще не знаю, что вызывает эту ошибку.

Я все еще предоставлю свой заголовок MainWindow, возможно, здесь есть ошибка.

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QNetworkReply>
#include <QObject>
#include "util/request.h"

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
    Request request;

public slots:
    void parse_trending(QNetworkReply *reply);
};

#endif // MAINWINDOW_H

1 Ответ

0 голосов
/ 04 ноября 2018

В следующем коде:

connect(manager, SIGNAL(finished(QNetworkReply*)), this, slot);

Вы указываете, что слот принадлежит этому, то есть он принадлежит Request, но слот принадлежит MainWindow, поэтому решение состоит в том, чтобы передать получателя в качестве параметра:

request.h

...
void make_request(const QUrl & url, QObject *receiver, const char *slot);
...

request.cpp

void Request::make_request(const QUrl url, QObject *receiver, const char* slot)
{
    QNetworkAccessManager* manager = new QNetworkAccessManager();
    connect(manager, SIGNAL(finished(QNetworkReply*)), receiver, slot);
    manager->get(QNetworkRequest(url));
}

и

request.make_request(QUrl("{ApiUrl}"), this, SLOT(parse_trending(QNetworkReply*)));

другой вариант с использованием std::function (#include <functional>):

void Request::make_request(const QUrl & url, std::function<void (QNetworkReply *)> slot)
{
    QNetworkAccessManager* manager = new QNetworkAccessManager();
    connect(manager, &QNetworkAccessManager::finished, slot);
    manager->get(QNetworkRequest(url));
}

request.make_request(QUrl("{ApiUrl}"), std::bind(&MainWindow::parse_trending, this, std::placeholders::_1));
...