1、实现方法:需重写Label的鼠标事件和绘图事件
2、工程代码如下:
mylabel.h
#ifndef MyLabel_H
#define MyLabel_H
#include <QLabel>
#include <QPoint>
#include <QPainter>
#include <QColor>
#include <QPaintEvent>
#include <QPen>
#include<QPainter>
#include <QWidget>
#include <QDebug>
#include <QMouseEvent>
#include <QPixmap>
class MyLabel : public QLabel
{
//Q_OBJECT
public:
explicit MyLabel(QWidget *parent = 0);
~MyLabel();
protected:
void paintEvent(QPaintEvent *event); //绘制矩形
void mousePressEvent(QMouseEvent *e); //鼠标按下
void mouseMoveEvent(QMouseEvent *e); //鼠标移动
void mouseReleaseEvent(QMouseEvent *e); //鼠标抬起
private:
QPoint m_rectStartPoint;
QPoint m_rectEndPoint;
};
#endif // MyLabel_H
mylabe.cpp
#include "mylabel.h"
MyLabel::MyLabel(QWidget *parent /*= 0*/ ) : QLabel(parent)
{
}
//鼠标按下
void MyLabel::mousePressEvent(QMouseEvent *e)
{
m_rectStartPoint = e->pos();
}
//鼠标移动
void MyLabel::mouseMoveEvent(QMouseEvent *e)
{
m_rectEndPoint = e->pos();
}
//鼠标抬起
void MyLabel::mouseReleaseEvent(QMouseEvent *e)
{
}
//绘图
void MyLabel::paintEvent(QPaintEvent *event)
{
QLabel::paintEvent(event); //先调用父类的paintEvent为了显示'背景'!!!
QPainter painter(this);
painter.setPen(QPen(Qt::green, 2));
if (m_rectStartPoint != m_rectEndPoint)
{
painter.drawRect(QRect(m_rectStartPoint, m_rectEndPoint));
}
}
//
MyLabel::~MyLabel()
{
}
main.cpp
#include "mywidget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MyWidget w;
w.show();
return a.exec();
}
mywidget.h
#ifndef MYWIDGET_H
#define MYWIDGET_H
#include <QWidget>
#include <QTimer>
#include "mylabel1.h"
#include "opencv2/opencv.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/videoio/videoio.hpp"
using namespace cv;
namespace Ui {
class MyWidget;
}
class MyWidget : public QWidget
{
Q_OBJECT
public:
explicit MyWidget(QWidget *parent = 0);
~MyWidget();
QImage mat2QImage(cv::Mat cvImg);
QImage ScaleImage2Label(QImage qImage, QLabel* qLabel);
private slots:
void readFrame();
private:
Ui::MyWidget *ui;
QTimer *timer;
Mat frame;
VideoCapture cap;
MyLabel *label;
};
#endif // MYWIDGET_H
mywidget.cpp
#include "mywidget.h"
#include "ui_mywidget.h"
MyWidget::MyWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::MyWidget)
{
ui->setupUi(this);
label = new MyLabel;
label->setStyleSheet("border:2px solid;border-color:blue");
ui->horizontalLayout->addWidget(label);
timer = new QTimer(this);
timer->start(10);
connect(timer, SIGNAL(timeout()), this, SLOT(readFrame()));
cap.open(1);
}
void MyWidget::readFrame()
{
cap >> frame;
if(frame.empty())
{
qDebug()<<"frame is empty";
cap.release();
}
QImage img = ScaleImage2Label( mat2QImage(frame), label );
label->setAlignment(Qt::AlignCenter);
label->setPixmap(QPixmap::fromImage(img));
}
QImage MyWidget::ScaleImage2Label(QImage qImage, QLabel* qLabel)
{
QImage qScaledImage;
QSize qImageSize = qImage.size();
QSize qLabelSize = qLabel->size();
double dWidthRatio = 1.0*qImageSize.width() / qLabelSize.width();
double dHeightRatio = 1.0*qImageSize.height() / qLabelSize.height();
if (dWidthRatio > dHeightRatio)
{
qScaledImage = qImage.scaledToWidth(qLabelSize.width());
} else {
qScaledImage = qImage.scaledToHeight(qLabelSize.height());
}
return qScaledImage;
}
QImage MyWidget::mat2QImage(cv::Mat cvImg)
{
QImage qImg;
if (cvImg.channels() == 3) //3 channels color image
{
cv::cvtColor(cvImg, cvImg, CV_BGR2RGB);
qImg = QImage((const unsigned char*)(cvImg.data),
cvImg.cols, cvImg.rows,
cvImg.cols*cvImg.channels(),
QImage::Format_RGB888);
}
else if (cvImg.channels() == 1) //grayscale image
{
qImg = QImage((const unsigned char*)(cvImg.data),
cvImg.cols, cvImg.rows,
cvImg.cols*cvImg.channels(),
QImage::Format_Indexed8);
}
else
{
qImg = QImage((const unsigned char*)(cvImg.data),
cvImg.cols, cvImg.rows,
cvImg.cols*cvImg.channels(),
QImage::Format_RGB888);
}
return qImg;
}
MyWidget::~MyWidget()
{
delete ui;
}
3、效果