C++ QT在错误的类中查找插槽

C++ QT在错误的类中查找插槽,c++,qt,qt5,qt-signals,qt-slot,C++,Qt,Qt5,Qt Signals,Qt Slot,我有一个单独的类用于使用QNetwork发出GET请求,如下所示 请求标题: #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 // REQUES

我有一个单独的类用于使用QNetwork发出GET请求,如下所示

请求标题:

#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
但是,它在{MainWindow}中生成错误
QObject::connect:No这样的插槽请求::parse_trending(QNetworkReply*)

我已经将Q_OBJECT宏添加到了头文件中,但是我仍然不知道是什么导致了这个错误

我仍然会提供我的主窗口标题,也许错误就在那里

#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
\ifndef主窗口
#定义主窗口
#包括
#包括
#包括
#包括“util/request.h”
名称空间用户界面{
类主窗口;
}
类主窗口:公共QMainWindow
{
Q_对象
公众:
显式主窗口(QWidget*parent=0);
~main窗口();
私人:
Ui::MainWindow*Ui;
请求;
公众时段:
无效分析趋势(QNetworkReply*reply);
};
#endif//main窗口
在以下代码中:

connect(manager, SIGNAL(finished(QNetworkReply*)), this, slot);
您指出插槽属于此,即它属于请求,但插槽属于MainWindow,因此解决方案是将接收器作为参数传递:

请求.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));
}


另一个使用
std::function
#include
)的选项:

...
void make_request(const QUrl & url, QObject *receiver, const char *slot);
...
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*)));
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));