QT调用一次方法后,调用里面的connect,会多次执行槽函数,connect所在的函数只调用了一次。

问题遇到的现象和发生背景
问题相关代码,请勿粘贴截图
void PhotoList::photoDownload(QString qurl)
{
    qDebug() << "执行一次photodownload";
    QNetworkAccessManager *accessManager = new QNetworkAccessManager(this);
    QNetworkRequest request;
    request.setUrl(QUrl(qurl));
    accessManager->get(request);
    connect(accessManager, SIGNAL(finished(QNetworkReply *)), this, SLOT(downloadReply(QNetworkReply *)));

}

void PhotoList::downloadReply(QNetworkReply *reply)
{

//    int1 = 0;
    qDebug() << "reply调用一次";

    if (reply->error() == QNetworkReply::NoError)
    {

        qDebug() << "--------3";
        QByteArray bytes = reply->readAll();
        QPixmap pixmap;
        pixmap.loadFromData(bytes);

        // 缓存到本地
        QFile file("E:/head.jpg");
        if (file.open(QIODevice::Append))
            file.write(bytes);

        file.close();
//        int1++ ;
        qDebug() << "--------4";
        qDebug() << "success photo show";
    }
    else
    {
        // 错误处理-显示错误信息,或显示上一次缓存的图片或叉图。
        qDebug() << "error photo show";
    }

}
运行结果及报错内容

执行一次photodownload
reply调用一次
--------3
--------4
success photo show
reply调用一次
--------3
--------4
success photo show
reply调用一次
--------3
--------4
success photo show
reply调用一次
--------3
--------4
success photo show
reply调用一次
--------3
--------4
success photo show
reply调用一次
--------3
--------4
success photo show
reply调用一次
--------3
--------4
success photo show
reply调用一次
--------3
--------4
success photo show
reply调用一次
--------3
--------4
success photo show
reply调用一次
--------3
--------4
success photo show
reply调用一次
--------3
--------4
success photo show

我的解答思路和尝试过的方法
我想要达到的结果


每次执行photoDownload函数,都会重新new一个QNetworkAccessManager 实例,这个干是不对的。
把accessManager 声明为成员变量,并在构造函数中new就可以了,connect也放在构造函数中。
如下:

//构造函数
PhotoList::PhotoList()
{
    //构造函数中的其它部分代码
    //....

    //初始化QNetworkAccessManager实例,把accessManager声明成类的成员变量
    accessManager = new QNetworkAccessManager(this);
    connect(accessManager, SIGNAL(finished(QNetworkReply *)), this, SLOT(downloadReply(QNetworkReply *)));
}

//删掉new和connect部分
void PhotoList::photoDownload(QString qurl)
{
    qDebug() << "执行一次photodownload";
    QNetworkRequest request;
    request.setUrl(QUrl(qurl));
    accessManager->get(request);
}

你可以把connect绑定注释掉,然后运行程序看看还有没有执行,我猜测是不是有其他地方已经多次进行了connect绑定了!

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632