【问题标题】:QT looking for slot in wrong classQT 在错误的类中寻找插槽
【发布时间】:2018-11-03 20:51:45
【问题描述】:

我有一个单独的类,用于使用 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

请求来源:

#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

【问题讨论】:

    标签: c++ qt qt5 qt-signals qt-slot


    【解决方案1】:

    在以下代码中:

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

    你是指出slot是属于这个的,就是属于Request但slot属于MainWindow,所以解决方法是把receiver作为参数传入:

    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 &lt;functional&gt;) 的另一个选项:

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

    【讨论】:

      猜你喜欢
      • 2010-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多