问题描述:
在QLabel上显示一张图片,然后在该图片上画一个矩形框 最后保存一张带矩形框的图片
第一步:
在图片上画矩形框 网上教程很多 代码如下: 头文件
#ifndef MYQLABEL #define MYQLABEL #include <QLabel> #include <QMouseEvent> #include <QString> class MyQLabel : public QLabel{ // Q_OBJECT public: // explicit MyQLabel(); void paintEvent(QPaintEvent* event); void mousePressEvent(QMouseEvent* event); void mouseReleaseEvent(QMouseEvent* event); void mouseMoveEvent(QMouseEvent* event); int x1, y1, x2, y2; void savePicture(QString path, int filename); public: int getX1() {return x1;} int getY1() {return y1;} int getX2() {return x2;} int getY2() {return y2;} }; #endif // MYQLABEL
源文件:
#include <QPainter> #include <QPen> #include <QRect> #include <QCursor> #include <QApplication> #include <QPixmap> #include <QImage> #include "myqlabel.h" void MyQLabel::paintEvent(QPaintEvent *event) { //comment before QLabel::paintEvent(event); //绘制背景的图片 QPainter painter(this); painter.setPen(QPen(Qt::red, 2)); painter.drawRect(QRect(x1, y1, x2 - x1, y2 - y1)); } void MyQLabel::mousePressEvent(QMouseEvent *event) { x1 = event->pos().x(); y1 = event->pos().y(); QCursor cursor; cursor.setShape(Qt::ClosedHandCursor); QApplication::setOverrideCursor(cursor); } void MyQLabel::mouseReleaseEvent(QMouseEvent *event) { x2 = event->pos().x(); //鼠标相对于所在控件的位置 y2 = event->pos().y(); update(); QApplication::restoreOverrideCursor(); } void MyQLabel::mouseMoveEvent(QMouseEvent *event) { if (event->buttons() & Qt::LeftButton) { x2 = event->pos().x(); //鼠标相对于所在控件的位置 y2 = event->pos().y(); update(); } }
第二步:
保存画完后的整个图形
思路如下:
取得QLabel上的图像 将其加入到一个Painter 然后获取之前画的矩形框的 起始 和终止坐标 重新绘制 然后保存
QImage tmpimage = image.copy(); QPixmap pmap; pmap = pmap.fromImage(tmpimage); label_video1->setPixmap(pmap); QImage img(label_video1->pixmap()->toImage()); QPainter painter; painter.begin(&img); painter.setPen(QPen(Qt::red, 2)); painter.drawRect(QRect(label_video1->getX1(), label_video1->getY1(), label_video1->getX2() - label_video1->getX1(), label_video1->getY2() - label_video1->getY1())); painter.end(); label_video2->setPixmap(QPixmap::fromImage(img));