本文共 4163 字,大约阅读时间需要 13 分钟。
本文将详细介绍一个自定义QLabel控件的实现方法,该控件能够支持图像缩放操作以及绘制矩形。实现的核心思路是重写Label类的鼠标事件和绘图事件,从而实现对图像的缩放和矩形绘制功能。
#ifndef MYLABEL_H#define MYLABEL_H#include#include #include #include #include #include #include #include #include #include #include #include #include #include class MyLabel : public QLabel {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
#include "mylabel.h"MyLabel::MyLabel(QWidget* parent) : 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); QPainter painter(this); painter.setPen(QPen(Qt::green, 2)); if (m_rectStartPoint != m_rectEndPoint) { painter.drawRect(QRect(m_rectStartPoint, m_rectEndPoint)); }} #include "mywidget.h"#includeint main(int argc, char* argv[]) { QApplication a(argc, argv); MyWidget w; w.show(); return a.exec();}
#ifndef MYWIDGET_H#define MYWIDGET_H#include#include #include "mylabel.h"#include #include #include #include using namespace cv;namespace Ui { class MyWidget;}class MyWidget : public QWidget { Q_OBJECTpublic: explicit MyWidget(QWidget* parent = 0); ~MyWidget(); QImage mat2QImage(cv::Mat cvImg); QImage ScaleImage2Label(QImage qImage, QLabel* qLabel);private: Ui::MyWidget* ui; QTimer* timer; Mat frame; VideoCapture cap; MyLabel* label;};#endif // MYWIDGET_H
#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); 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) { 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) { 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;} 本项目实现了一个基于Qt的自定义Label控件,该控件主要支持以下功能:
通过上述实现,可以方便地在应用程序中快速实现图像缩放和矩形绘制功能,适用于需要图像处理和交互的场景。
转载地址:http://msco.baihongyu.com/