首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QNetworkReply误差信号不能连续发射

QNetworkReply误差信号不能连续发射
EN

Stack Overflow用户
提问于 2021-01-28 15:13:29
回答 1查看 69关注 0票数 0

我需要从网页上获取xml信息,而且我可以。

我用计时器连续地获取信息。

我的问题是,我不能继续捕捉错误信号。我只抓过一次。

我试过QT帮助页面上的例子,我读了很多,但是没有成功。

这是我的密码;

mainwindow.h

代码语言:javascript
复制
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QDebug>
#include <QTimer>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
    QNetworkReply *reply;
    QNetworkRequest request;
    QNetworkAccessManager *manager;
    QTimer *timer;

private slots:
    void replyFinished(QNetworkReply*);
    void updateDB();
    void slotError(QNetworkReply::NetworkError);
    void slotSslErrors(QList<QSslError>);
};
#endif // MAINWINDOW_H

mainwindow.cpp

代码语言:javascript
复制
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    manager = new QNetworkAccessManager(this);

    request.setUrl(QUrl("https://www.w3schools.com/xml/note.xml"));

    // Get response
    updateDB();

    // Signals for xml
    connect(manager, SIGNAL(finished(QNetworkReply*)),this, SLOT(replyFinished(QNetworkReply*)));
    connect(reply, SIGNAL(error(QNetworkReply::NetworkError)),this, SLOT(slotError(QNetworkReply::NetworkError)));
    connect(reply, SIGNAL(sslErrors(QList<QSslError>)),this, SLOT(slotSslErrors(QList<QSslError>)));

    // Update timer
    timer = new QTimer(this);
    timer->start(2000);
    connect(timer,SIGNAL(timeout()),this,SLOT(updateDB()));
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::replyFinished(QNetworkReply *)
{
    qDebug() << reply->readAll();
    reply->deleteLater();
}

void MainWindow::updateDB()
{
    reply = manager->get(request);
}

void MainWindow::slotError(QNetworkReply::NetworkError)
{
    qDebug() << "slotError";
    reply->deleteLater();
}

void MainWindow::slotSslErrors(QList<QSslError>)
{
    qDebug() << "slotSslErrors";
    reply->deleteLater();
}

编辑:我使用的是QT5.13.1,我在.pro文件中添加了QT .pro网络

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-28 16:10:56

在您的UpdateDB中,您创建了一个新的回复:

代码语言:javascript
复制
reply = manager->get(request);

但你从来没有连接过它的信号。

第一个是在构造函数中连接它的信号,这就是为什么它可以用于第一个构造函数。

修复很简单:将reply的信号连接从构造函数移动到UpdateDB函数,因此对于您创建的每个新的reply对象都要这样做:

代码语言:javascript
复制
reply = manager->get(request);
connect(reply, SIGNAL(error(QNetworkReply::NetworkError)),this, SLOT(slotError(QNetworkReply::NetworkError)));
connect(reply, SIGNAL(sslErrors(QList<QSslError>)),this, SLOT(slotSslErrors(QList<QSslError>)));
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65939939

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档