在图像处理程序中,经常需要在图片上绘制一些图像,用以提示用户或展示一些信息。例如,需要绘制一个矩形框,显示当前处理的图像是原图像的一部分。
一般在Qt中,可以使用QLabel控件来显示图片。但是使用QLabel既显示图片又显示自己绘制的图形,会很不方便。可以自定义个类,继承自QLabel,并且重写QLabel的paintEvent方法,在此方法中,绘制自己的图形。
这里自定的类为MyLabel,源码如下:
MyLabel.h
#pragma once
#include <QtWidgets/QLabel>
class MyLabel : public QLabel
{
public:
MyLabel(QWidget *parent);
void MyLabel::paintEvent(QPaintEvent *e) override;
private:
QPixmap m_Img;
};
MyLabel.cpp
#include <QtGUI/QPainter>
#include "MyLabel.h"
MyLabel::MyLabel(QWidget *parent)
:QLabel(parent)
{
m_Img = QPixmap("test.png");
setPixmap(m_Img);
setGeometry(50, 50, m_Img.width(), m_Img.height());
}
void MyLabel::paintEvent(QPaintEvent *e)
{
QLabel::paintEvent(e);//调用基类的绘制方法,绘制图片背景
QPainter painter(this);
QPen pen(QColor(255, 222, 0), 2);
painter.setPen(pen);
painter.drawRect(30, 30, 400, 400);//绘制矩形
}
在MyLabel的paintEvent 方法中,先调用基类的paintEvent方法,是为了绘制背景图片,若不调用这个方法,背景图片将不会绘制。
main.cpp
#include <QtWidgets/QApplication>
#include <QtWidgets/QWidget>
#include "MyLabel.h"
int main(int argc, char* argv[])
{
QApplication app(argc, argv);
QWidget widget;
widget.setWindowTitle("ShowPicture");
widget.resize(900, 600);
MyLabel* lbl = new MyLabel(&widget);
widget.showNormal();
return app.exec();
}
最终的效果: