Qt显示图片时,一般采用QPainter进行绘制,QPainter提供各种绘制操作,画图片,文字,多边形等,如何把一张图片绘制到另一张图片呢,比如要显示一个视频标志,一般是一张视频的第一帧再加一个播放的图标,这个时候可以用paintEvent函数里用QPainter画,而如果只是显示这个标志可以用QLabel来显示setPixmap(), 可以省去paintEvent函数,直接用QPainter把播放图片画到视频图片上,然后把QPixmap设置到QLabel上显示,下面来看具体的实现:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QPixmap>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
void initView();
QPixmap setRound(const QPixmap& imageIn, int radius);
QPixmap drawImage(QPixmap pix1, QPixmap pix2);
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QPainter>
#include <QBitmap>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
initView();
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::initView()
{
QPixmap pix1(":/image/videoFrame.jpg");
QPixmap pix2 = setRound(pix1, 5);
QPixmap pix(":/image/playIcon.jpeg");
pix = drawImage(pix2, pix);
ui->label->setPixmap(pix);
}
//设置圆角
QPixmap MainWindow::setRound(const QPixmap& imageIn, int radius)
{
if (imageIn.isNull())
{
return QPixmap();
}
QSize size(imageIn.size());
QBitmap mask(size);
QPainter painter(&mask);
painter.setRenderHint(QPainter::Antialiasing);
painter.setRenderHint(QPainter::SmoothPixmapTransform);
painter.fillRect(mask.rect(), Qt::white);
painter.setBrush(QColor(0, 0, 0));
painter.drawRoundedRect(mask.rect(), radius, radius);
QPixmap imageOut = imageIn;// .scaled(size);
imageOut.setMask(mask);
return imageOut;
}
QPixmap MainWindow::drawImage(QPixmap pix1, QPixmap pix2)
{
//把pix2画在pix1上
QPainter painter(&pix1);
painter.drawPixmap((pix1.width() - pix2.width()) / 2, (pix1.height() - pix2.height())/2, pix2.width(), pix2.height(), pix2);
return pix1;
}
运行效果: