Qt 绘制图片

QLabel显示图片效率问题

在Qt开发中,经常会遇到显示图片的需求;我们通常会使用QLabel的setPixmap()将图片显示出来;但是如果在性能吃紧的嵌入式设备上,此方法可能会看起来很卡;

为了解决这个问题,我们可以自定义一个控件,重写paintEvent,使用drawPixmap或者drawImage来绘制图片,这样效率会比使用QLbael有所提高,也可以实现与QLabel一样的setPixmap()效果

class ImageWidget : public QWidget
{
    Q_OBJECT
public:
    explicit ImageWidget(QWidget *parent = nullptr);
    void setPixmap(const QPixmap& pix);

signals:

    // QWidget interface
protected:
    virtual void paintEvent(QPaintEvent *event) override;

private:
    QPixmap m_curPixmap;
};

ImageWidget::ImageWidget(QWidget *parent) : QWidget(parent)
{

}

void ImageWidget::setPixmap(const QPixmap &pix)
{
    m_curPixmap = pix;
    update();
}

void ImageWidget::paintEvent(QPaintEvent *event)
{
    if (!m_curPixmap.isNull())
    {
        QPainter painter(this);
        painter.setRenderHint(QPainter::Antialiasing);  // 抗锯齿
//        painter.drawPixmap(this->rect(), m_curPixmap);
        //如果此控件被放在布局中,且需要显示不同大小的图片,则可以在布局中固定此控件的大小(将大小固定到足够大),并将图片绘制在控件的中央(或其他位置)
        painter.drawPixmap((this->width() - m_curPixmap.width()) / 2, (this->height() - m_curPixmap.height()) / 2, m_curPixmap);
    }
    QWidget::paintEvent(event);
}

QLabel显示图片的使用场景

QLabel的setPixmap方法是一个非常简单易用的方法,可以快速地将图片显示在界面上。如果你的应用程序只需要在固定位置显示固定大小的图片,并且不需要进行太多的自定义操作,那么这种方式可能是最好的选择。

但是,QLabel的setPixmap方法的效率并不是最高的。因为在背后,Qt需要为QLabel创建一个绘制设备(QWidget),并且在每次窗口需要重绘时调用QLabel的paintEvent方法。这可能会导致一些不必要的绘制操作,特别是在显示大量图片或者在复杂的界面布局下。

drawImage与drawPixmap

drawImage和drawPixmap是两个在图形编程中常见的绘图函数。它们在使用上有一些区别,请看下面的解释:

drawImage函数:

drawImage函数可以用于在画布上绘制QImage、QPixmap和QBitmap等类型的图像。
drawImage函数使用一个矩形区域来确定图像在画布上的位置和大小,并将图像绘制到该矩形区域内。
在绘制时,drawImage函数可以进行图像的缩放、旋转和反转等操作。
由于drawImage函数可以接受QImage类型的图像,因此可用性更广。

drawPixmap函数:

drawPixmap函数用于在画布上绘制QPixmap类型的图像。
drawPixmap函数也使用一个矩形区域来确定图像在画布上的位置和大小,并将图像绘制到该矩形区域内。
与drawImage函数相比,drawPixmap函数的绘制速度更快,因为QPixmap是一个优化过的图像对象,可提供更高性能的绘制。
由于drawPixmap函数仅限于处理QPixmap类型的图像,因此可用性较为有限。
综上所述,drawImage函数对于不同类型的图像都适用,而drawPixmap函数则专门用于绘制QPixmap图像,并在性能上具有优势。选用哪个函数取决于您的需求和图像类型。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值