【问题标题】:Undefined symbols for architecture x86_64 with QNetworkReply带有 QNetworkReply 的架构 x86_64 的未定义符号
【发布时间】:2021-10-11 20:22:33
【问题描述】:

我不断收到以下错误: 架构 x86_64 的未定义符号:“checkinapp::myOnFinishedSlot(QNetworkReply*)”,引用自:“checkinapp::qt_static_metacall(QObject*,QMetaObject::Call,int,void**) in moc_checkinapp.o

我看了好几遍,都想不出哪里出错了。 (我是 C++ 新手,所以很抱歉我可能错过了一些明显的东西)。任何帮助表示赞赏:)

这是我的课:

class checkinapp : public QMainWindow
{
    Q_OBJECT

public:
    checkinapp(QWidget *parent = nullptr);
    ~checkinapp();
    void databasehandler(QWidget *parent = nullptr);
    int stressed;
    int happy;
    int hungry;
    int tired;
    int gender;
    bool help;
    int grade;
    bool submitted;
    void post()
    {
        m_networkManager = new QNetworkAccessManager ( this );
        QVariantMap newUser;
        newUser[ "Stress" ] = QString::number(stressed);
        newUser[ "Sleep" ] = QString::number(tired);
        newUser[ "Hungry" ] = QString::number(hungry);
        newUser[ "Happy" ] = QString::number(happy);
        newUser[ "Grade" ] = QString::number(grade);
        newUser[ "Date" ] = "1/10/21";
        newUser[ "Gender" ] = QString::number(gender);
        newUser[ "Aid" ] = QString::number(help);
        QJsonDocument jsonDoc = QJsonDocument::fromVariant( newUser );
        QNetworkRequest newUserRequest( QUrl( "url/User.jason"));
        newUserRequest.setHeader( QNetworkRequest::ContentTypeHeader, QString( "application/json" ));

        connect(m_networkManager, &QNetworkManager::finished, this, &checkinapp::myOnFinishSlot); // the error is here 

        m_networkManager->post( newUserRequest, jsonDoc.toJson() );
    }
    void exit()
    {
        QApplication::quit();
    }

public slots:
    void myOnFinishSlot(QNetworkReply* x) { exit(); } 
private slots:

    void on_happy_valueChanged(int value);

    void on_hungry_valueChanged(int value);

    void on_sleep_valueChanged(int value);

    void on_stress_valueChanged(int value);

    void on_male_toggled(bool checked);

    void on_female_toggled(bool checked);

    void on_other_toggled(bool checked);

    void on_help_toggled(bool checked);

    void on_pushButton_clicked();

private:
    Ui::checkinapp *ui;
    QNetworkAccessManager * m_networkManager;
    QNetworkReply * m_networkReply;
};

【问题讨论】:

  • 在您发布的代码中确实没有定义该方法。你在某处有定义吗?
  • 现代 Qt 中不要使用 SIGNAL/SLOT 语法。
  • void myOnFinishSlot(QNetworkReply* x); 当这个方法被调用时你期望发生什么?
  • 您的编译器错误输出与您的代码所说的不匹配。尝试清理并重建所有内容。
  • sry 我忽略了您实际上是在定义方法,只是签名错误。请注意,void myOnFinishSlot(QNetworkReply* x); 只是一个声明,错误抱怨缺少定义

标签: c++ qt qnetworkreply


【解决方案1】:

你的声明

void myOnFinishSlot(QNetworkReply* x)

不符合你的定义:

void myOnFinishSlot()

您有效地定义了两个具有不同重载的方法。

要么合并定义和声明:

public slots:
void myOnFinishSlot(QNetworkReply* x) { exit(); }

或将定义移到class 块之外:

void checkinapp::myOnFinishSlot(QNetworkReply* x) { exit(); }

此外,不要使用 SIGNAL/SLOT 表示法,因为它会在运行时导致难以调试的错误。你的connect 电话应该是:

connect(m_networkManager, &QNetworkAccessManager::finished, this, &checkinapp::myOnFinishSlot);

【讨论】:

  • 感谢@Botje,我将问题中的课程更新为我认为您的建议。但现在我收到错误“使用未声明的标识符“QNetworkManager”
  • 很抱歉,这些可能是人们应该知道的显而易见的事情,但我一直在尝试自学 C++,但 2 天前才开始
  • 打错字了,应该是QNetworkAccessManager
  • 感谢@Botje 的帮助,这修复了错误但没有修复程序,该类仍在退出而没有上传到数据库。原问题:stackoverflow.com/questions/69523389/…
  • 另外@Botje,我强烈建议您在您的个人资料中添加捐赠链接。您几乎评论或回答了我关于堆栈溢出的所有帖子,我很乐意捐款以感谢所有惊人的努力和帮助。
猜你喜欢
  • 1970-01-01
  • 2014-08-07
  • 2012-07-20
  • 2014-09-08
  • 1970-01-01
  • 2015-08-23
  • 2014-05-27
  • 2017-07-06
  • 2016-06-20
相关资源
最近更新 更多