gpt4 book ai didi

c++ - QPainting QPixmap使用裁剪来获得性能

转载 作者:行者123 更新时间:2023-12-02 09:51:44 26 4
gpt4 key购买 nike

我正在尝试在Qt中创建一个支持缩放的简单图像查看器。
要显示图像文件,我将其加载到QImage中并创建QPixmap。

class NN: public QWidget{
Q_OBJECT
Q_DISABLE_COPY(NN)
public:
NN(QWidget* parent = nullptr) : QWidget(parent){
}
const QPixmap& pixmap() const
{
return m_pixmap;
}
void setPixmap(const QPixmap& px)
{
m_pixmap = px;
update();
}
protected:
void paintEvent(QPaintEvent*)
{
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing, false);
style()->drawItemPixmap(&painter, rect(), Qt::AlignCenter, m_pixmap.scaled(rect().size()));
}
private:
QPixmap m_pixmap;
};
(此小部件是ScrollArea的一部分)
这可以正常工作,但是当我尝试加载大图像并放大时,性能开始下降(滞后)。
我曾考虑将剪辑应用于 drawItemPixmap()方法,但我不确定如何以及是否会有助于提高性能。
我的问题是剪辑的想法是否可行,如果可行。如果没有,也许还有另一种提高性能的方法?

最佳答案

m_pixmap和/或rect()非常大时,您的大部分减速可能来自以下位置:

m_pixmap.scaled(rect().size())
在这里,您要让Qt创建一个新的 QPixmap对象,该对象的大小与 rect()相同,这可能是非常昂贵的操作。并将该 QPixmap对象传递到对 drawItemPixmap()的调用中,该调用将仅绘制一小部分像素图,此后 QPixmap对象将被丢弃,并且下次您要重新绘制对象时,必须重新执行整个过程。
不用说,这可能是非常低效的。
一种更有效的方法是调用 QPainter::drawPixmap(const QRect & target, const Pixmap & pixmap, const QRect & source),如下所示:
painter.drawPixmap(rect(), m_pixmap, srcRect);
...和 drawPixmap()将通过重新缩放 rect()m_pixmap的内容来绘制大小为 srcRect(即小部件的大小)的缩放像素图;与重新缩放整个 m_pixmap图像相比,效率要高得多。
当然,您需要为 srcRect计算正确的left / top / width / height值,但这应该很简单,只需一点代数。 (基本上只是根据小部件的当前缩放/平移状态找出像素图的当前应显示的部分)

关于c++ - QPainting QPixmap使用裁剪来获得性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64016040/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com