qwidget窗口加载图片后无限放大,内存不断增长至GB级别



  • 重写paintEvent,如下代码:
    QPainter painter(this);
    painter.scale((double)this->width() / (double)this->pixmap()->width(),
    (double)this->height() / (double)this->pixmap()->height());
    QPixmap tempPic = (*this->pixmap());
    painter.setRenderHint(QPainter::SmoothPixmapTransform);
    painter.drawPixmap(pixmap()->rect(),tempPic);

    一开始直接使用:
    QPainter painter(this);
    QPixmap tempPic = (*this->pixmap());
    painter.setRenderHint(QPainter::SmoothPixmapTransform);
    painter.drawPixmap(this->rect(),tempPic);

    两种办法均无效。个人认为,只要QT需要画很大面积的图片,内存就会增长。查了一下qpainter有viewport这个属性,qpainterevent事件可以拿到rect(需要绘制的区域)。但如何只画视口区域是一个问题。特来此求教讨论。



  • 当窗口无限放大时,内存能达到2G,而且无法缩小回去(卡死或难以操作)



  • @flowerloveqwidget窗口加载图片后无限放大,内存不断增长至GB级别 中说:

    QPixmap tempPic = (*this->pixmap());

    这个为什么不做成引用呢?虽然是隐式共享的,但是用引用是一个好的点子。
    另外QPainter::scale,这个方法估计比较吃性能,建议做一下性能测试,看哪个函数遇到了瓶颈。



  • @jiangcaiyang123 谢。第二种写法中,即使不在paintEvent里做qpinater::scale操作(或qpixmap的scaled操作),但传入的pixmap和rect区域大小不一致时,qpainter在DrawPixmap时,也会scale。
    这是drawpixmap函数的部分注释内容:\note The pixmap is scaled to fit the rectangle, if both the pixmap and rectangle size disagree.

    我想讨论的内容是:qt将图片画到大尺寸窗口上时占用大内存的问题,是自身问题无法解决吗?



  • @flowerlove 这个我没有详细观察,可能因Qt版本而异。
    如果真的出现了这个问题,那么尝试注释掉关键语句,以确定引起问题的具体部分,具体到函数。
    然后翻看Qt源码,看看函数是如何实现的。
    最后查看一下Qt有没有别的实现,如果没有,那么自己换一种更加高效的方式实现。


Log in to reply
 

走马观花

最近的回复

  • 萌梦 男孩,女孩,和蛋

    menghome.png

    read more
  • 设计模式-工厂模式

    使用qt/qml来演示设计模式效果,便于学习理解

    1)定义创建对象的接口,封装对象的创建
    2)使具体化类的工作延迟到工厂子类中

    bg.png
    image.png

    1. 工厂类

    createProduct使用了参数来选择要创建哪个产品

    #ifndef FACTORY_H #define FACTORY_H #include <QObject> class Product; class QString; class Factory: public QObject { Q_OBJECT public: virtual ~Factory() = 0; virtual Product* createProduct(QString type) = 0; protected: Factory(); }; class ConcreteFactory: public Factory { Q_OBJECT public: ~ConcreteFactory(); ConcreteFactory(); public slots: Product* createProduct(QString type); }; #endif // FACTORY_H #include "factory.h" #include "product.h" #include <QtQml/qqml.h> Factory::~Factory() { } Factory::Factory() { qmlRegisterType<Product>("Product", 1, 0, "Product"); } ConcreteFactory::~ConcreteFactory() { } ConcreteFactory::ConcreteFactory() { } Product *ConcreteFactory::createProduct(QString type) { if(type == "boy") return static_cast<Product *>(new ConcreteProduct1()); else if(type == "girl") return static_cast<Product *>(new ConcreteProduct2()); return static_cast<Product *>(new ConcreteProduct1()); } 2 产品类

    一个产品是萌梦男,一个产品是萌梦女

    #ifndef PRODUCT_H #define PRODUCT_H #include <QObject> class Product: public QObject { Q_OBJECT public: virtual ~Product() = 0; Q_PROPERTY(QString icon READ icon NOTIFY iconChanged) QString m_icon; QString icon() const { return m_icon; } signals: void iconChanged(QString icon); protected: Product(); signals: public slots: }; class ConcreteProduct1: public Product { Q_OBJECT public: ~ConcreteProduct1(); ConcreteProduct1(); }; class ConcreteProduct2: public Product { Q_OBJECT public: ~ConcreteProduct2(); ConcreteProduct2(); }; #endif // PRODUCT_H #include "product.h" Product::~Product() { } Product::Product() { } ConcreteProduct1::~ConcreteProduct1() { } ConcreteProduct1::ConcreteProduct1() { m_icon = "qrc:/images/boy.png"; } ConcreteProduct2::~ConcreteProduct2() { } ConcreteProduct2::ConcreteProduct2() { m_icon = "qrc:/images/girl.png"; } 3. main.qml

    使用timer,canvas,listview等实现一个自动化生产的动画效果

    源代码

    Fork me on Gitee

    read more
  • blender建模 章鱼
    捕获2.PNG 😵

    read more

关注我们

微博
QQ群