只可追忆 2022-02-08 14:55 采纳率: 100%
浏览 119
已结题

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

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


  • 写回答

3条回答 默认 最新

  • 关注

    每次执行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);
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 2月16日
  • 已采纳回答 2月8日
  • 创建了问题 2月8日

悬赏问题

  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来