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图像,并在性能上具有优势。选用哪个函数取决于需求和图像类型。