zoukankan      html  css  js  c++  java
  • Qt项目中出现的卡顿问题记录总结

    1.QPixmap::loadFromData导致卡顿

    由于项目中需要从网络上获取图片资源,这里用到的方法是QPixmap::loadFromData方法 然后将QPixmap通过setPixmap设置到QLabel中,起初直接在GUI线程中执行着一段代码,但是发现,一旦开始获取网络资源,就会出现无响应现象,刚开始还以为是读写造成的,后来通过调试,发现这一步需要消耗大量的时间,最后 我将这个转换过程写到一个子线程中,将QByteArray转换成QPixmap然后通过信号发送出去,GUI线程接收到信号就可以直接操作QPixmapQLabel中。

    1.1 QPixmap不能在子线程中操作,会出现内存错误

    通过查阅文档发现, QPixmap跟硬件有关的,专门用于绘制的,因此无法在子线程中操作,图片资源的读写大多数通过QImage来完成,因此上述方法会报错,转换了思路,我们将QImage作为数据进行信号传递,但仍会报内存错误。查阅百度得知,需要进行一次scaled操作,具体原因未知,代码如下:

    if(image.isNull())
    {
        return;
    }
    // 注意这里的scaled必须在image上完成,在Pixmap上完成也会报错
    QPixmap mPixmap = QPixmap::fromImage(image.scaled(ui->itemIconLabel->width(), ui->itemIconLabel->height()));
    ui->itemIconLabel->setPixmap(mPixmap);
    

    2.错误的槽函数绑定导致错误

    上述操完成之后,程序的卡顿现象确实少了不少,但是程序输出上面会出现这样一行字QThread::start: Failed to create thread (xxxxx)
    出现这样的情况,我记录了子线程调用的次数,结果输出大吃一惊:当前图片次数 36100,结果输出了36000多个线程,结果可想而知,解决这个问题的方法就是减少线程数,知道了肯定是线程调用次数太多了。
    通过分析,发现槽函数绑定的问题。一开始我将connect写在了一个槽函数中,这个槽函数是处理网页请求得到的数据的,一个网页基本上有20-30条数据,因此每次执行这个槽函数,都会connect一次,而且是递归进行的。所以叠加connect次数才会出现这个数。

    // 原程序代码
    void MainWidget::addHomeItem(QWidget *listWidget, HomeItem *homeItem)
    {
        movieItem* homeMovieItem = new movieItem(this);
    
        homeMovieItem->homeItem = homeItem;
        homeMovieItem->setText(homeItem->itemTitle);
        homeMovieItem->setNumber(homeItem->itemNumber);
        homeMovieItem->setTime(homeItem->itemTime);
    
        listWidget->layout()->addWidget(homeMovieItem);
    
        void *widgetAttribute = (void *)homeMovieItem;
        this->homeImgRequest->get(widgetAttribute, QUrl(homeItem->imgPath), true);
        // 后来我将这个connect函数放在了构造函数中,连接数减少到了正常
        connect(this->homeImgRequest, SIGNAL(dataRequested(void*,QByteArray)), this, SLOT(onReceivedItemImg(void*,QByteArray)));
    }
    
  • 相关阅读:
    自制“低奢内”CSS3注册表单,包含JS验证哦。请别嫌弃,好吗?。
    自制“低奢内”CSS3登入表单,包含JS验证,请别嫌弃哦。
    到网上收集了一个“高大上”的CSS3登入表单和大家分享一下
    利用:before和:after伪类制作CSS3 圆形按钮 含demo
    Font Awesome 4.0.3 提供了369个网页常用的矢量字体图标,新浪、人人 的矢量图标也到其中哟
    CSS3无前缀脚本prefixfree.js与Animatable使用介绍
    JAVA 利用Dom4j实现英语六级词汇查询 含演示地址
    JAVA中 XML与数据库互转 学习笔记三
    JAVA与DOM解析器提高(DOM/SAX/JDOM/DOM4j/XPath) 学习笔记二
    JAVA与DOM解析器基础 学习笔记
  • 原文地址:https://www.cnblogs.com/During/p/12401748.html
Copyright © 2011-2022 走看看