QT中在QLabel显示图片并且利用鼠标点击画线
https://blog.csdn.net/binleebit/article/details/75949211
Qt中在label上载入图片后在上面画矩形框的方法
https://www.it610.com/article/3860174.htm
实际使用: Qt自定义控件的创建与初步使用(二)之图片上绘制文字、箭头、曲线 https://blog.csdn.net/panshun888/article/details/52074400
参考hamamatsu案件
另外,可以参考:qt中在QLabel上显示图像并画矩形框。 https://blog.csdn.net/m0_37684310/article/details/80659283
QT中在QLabel显示图片并且利用鼠标点击画线
最近在做在Label上显示图片并且通过鼠标点击画线,在网上查了很多零零散散的东西,收获也多
很多初学者更希望直接贴代码,这样可以模仿来写,我下面直接贴出我的项目中自己写的maLabel类(如果只是实现利用鼠标绘制,重写void paintEvent(QPaintEvent *event);void mousePressEvent(QMouseEvent *e); void mouseMoveEvent(QMouseEvent *e); void mouseReleaseEvent(QMouseEvent *e);即可,其他函数是我项目需求所以多写的,可以忽略)
申明myLabel类,继承QLabel,生成myLabel.h和myLabel.cpp文件
以下为我的代码,供参考。我只是实现了画一条直线,如果要画多条,可以用vector将之前若干条的信息干存下来,每次都绘制
myLabel.h
-
#ifndef MYLABEL_H
-
#define MYLABEL_H
-
#include <QLabel>
-
#include <QPoint>
-
#include <QColor>
-
#include <QPaintEvent>
-
#include <QImage>
-
#include <QPixmap>
-
-
class myLabel :
public QLabel
-
{
-
//Q_OBJECT
-
public:
-
myLabel();
-
//~myLabel();
-
//绘制线条
-
virtual void paintEvent(QPaintEvent *event) override;
-
//鼠标按下
-
void mousePressEvent(QMouseEvent *e);
-
//鼠标移动
-
void mouseMoveEvent(QMouseEvent *e);
-
//鼠标抬起
-
void mouseReleaseEvent(QMouseEvent *e);
-
-
//设置所画线条属性
-
void setLineColor(const QColor lineColor);
-
void setLineSize(const int lineSize);
-
//得到画线的起点和终点
-
QPoint getStartPoint();
-
QPoint getEndPoint();
-
-
void clear();
-
-
private:
-
QPoint lineStartPoint;
//画线起点
-
QPoint lineEndPoint;
//画线终点
-
QColor lineColor;
//线条颜色
-
int lineSize;
//5种线型
-
bool isPressed;
-
};
-
-
#endif // MYLABEL_H
myLabel.cpp
-
#include "myLabel.h"
-
#include <QPen>
-
#include<QPainter>
-
-
myLabel::myLabel()
-
{
-
this->lineStartPoint = QPoint(
0,
0);
-
this->lineEndPoint = QPoint(
0,
0);
-
this->lineColor = QColor(Qt::black);
-
this->lineSize =
3;
-
}
-
-
//绘制线条
-
void myLabel::paintEvent(QPaintEvent *event)
-
{
-
QLabel::paintEvent(event);
//必须有,才能让背景图片显示出来
-
QPainter painter(this);
-
QPen pen;
-
pen.setColor(lineColor);
-
pen.setWidth(lineSize);
-
painter.setPen(pen);
-
painter.drawLine(lineStartPoint,lineEndPoint);
-
}
-
-
//鼠标按下
-
void myLabel::mousePressEvent(QMouseEvent *e)
-
{
-
lineStartPoint = e->pos();
-
lineEndPoint = e->pos();
-
//在图片上绘制
-
isPressed =
true;
-
}
-
-
//鼠标移动
-
void myLabel::mouseMoveEvent(QMouseEvent *e)
-
{
-
if(isPressed)
-
{
-
lineEndPoint=e->pos();
-
update();
-
}
-
}
-
-
//鼠标抬起
-
void myLabel::mouseReleaseEvent(QMouseEvent *e)
-
{
-
isPressed=
false;
-
update();
-
}
-
-
void myLabel::setLineColor(
const QColor lineColor)
-
{
-
this->lineColor = lineColor;
-
}
-
-
void myLabel::setLineSize(
const
int lineSize)
-
{
-
this->lineSize = lineSize;
-
}
-
-
QPoint myLabel::getStartPoint()
-
{
-
return lineStartPoint;
-
}
-
-
QPoint myLabel::getEndPoint()
-
{
-
return lineEndPoint;
-
}
-
-
void myLabel::clear()
-
{
-
lineStartPoint = QPoint(
0,
0);
-
lineEndPoint = QPoint(
0,
0);
-
update();
-
}
Qt中在QLabel上载入图片后在上面画矩形框的方法
通常我们会在QLabel上显示图片(本文假设你已经会了,不会的话搜一下也很简单),但是有时候我们会需要在演示时在图片上画些东西。比如,我想显示我在图片上用鼠标选取的矩形框,即画一个红矩形框。这个问题说简单也简单,但是千万别小看它,我就曾被这个小问题折磨了一个周末,最后终于搞定,记录下分享给日后需要的朋友吧。先来张图展示下我们想达到的效果:
首先,需要子类化控件QLabel成你自己的类如myLabel, 然后重写myLabel的paintEvent方法。这个方法的目的是保证你能在这个myLabel类生成的对象中画图并显示。如果你只在上面这个QDialog对话框中重写paintEvent方法的话,那么在画框的时候图片上的红线是无法显示出来的(感觉上就是图片遮挡了画的框)。
此外,重写子类的paintEvent方法时还有一个非常重要的地方,网上好多方法都忽略了没提这个地方,那就是在重写的paintEvent方法中首先要显式的调用父类的paintEvent方法!!! 忽略的结果就是重写了子类的paintEvent方法后运行时你却看不到这个myLabel控件了。。下面是重写QLabel的子类myLabel的paintEvent方法的代码示例:
void myLabel::paintEvent(QPaintEvent *event)
{
QLabel::paintEvent(event);//先调用父类的paintEvent为了显示'背景'!!!
QPainter painter(this);
painter.setPen(QPen(Qt::red,2));
painter.drawRect(QRect(x,y,w,h));
}
qt中在QLabel上显示图像并画矩形框。
最主要的是重写paintEvent()函数,下面直接看代码
mylabel.h
-
# pragma execution_character_set(“utf-8”)
-
-
#ifndef MYLABEL_H
-
#define MYLABEL_H
-
#include <list>
-
#include <map>
-
#include<QLabel>
-
#include<QPoint>
-
#include<QMouseEvent>
-
#include<QPainter>
-
#include<QWidget>
-
#include<QDebug>
-
#include<iostream>
-
#include<QString>
-
#include<QImage>
-
-
-
using
namespace
std;
-
#define WIDTH 640
-
#define HEIGHT 360
-
-
-
class MyLabel :
public QLabel
-
{
-
Q_OBJECT
-
public:
-
-
MyLabel(QWidget *parent =
0);
-
-
-
protected:
-
void paintEvent(QPaintEvent *event);
-
-
private slots :
-
void slotGetOneFrame(QImage img);
-
-
private:
-
QImage wb_Image;
-
};
-
-
#endif // MYLABEL_H
mylabel.cpp
-
#include “mylabel.h”
-
-
-
MyLabel::MyLabel(QWidget *parent):QLabel(parent)
-
{
-
}
-
-
//接收sig_GetOneFrame信号,调用update在界面中显示图像
-
void MyLabel::slotGetOneFrame(QImage img)
-
{
-
wb_Image = img;
-
update();
//调用update将执行 paintEvent函数
-
}
-
-
void MyLabel::paintEvent(QPaintEvent *event)
-
{
-
QLabel::paintEvent(event);
-
-
//画出图像
-
QPainter painter(this);
-
-
if (wb_Image.size().width() <=
0)
return;
-
///将图像按比例缩放成和窗口一样大小
-
QImage img = wb_Image.scaled(QSize(WIDTH, HEIGHT), Qt::IgnoreAspectRatio);
-
int x =
this->width() - img.width();
-
int y =
this->height() - img.height();
-
painter.drawImage(QPoint(x, y), img);
-
-
// 画矩形框
-
QPainter paint;
-
paint.begin(
this);
-
-
paint.setPen(QPen(Qt::red,
1, Qt::SolidLine, Qt::RoundCap));
-
paint.drawRect(QRect(
50,
50,
200,
200));
-
-
QString strText = QString::fromLocal8Bit(
“用双手成就你的梦想”);;
-
paint.drawText(
250,
50, strText);
-
-
paint.end();
-
}
其中用到了信号槽,大家注意到头文件中
-
private slots :
-
void slotGetOneFrame(QImage img);
这是槽函数,还需要一个信号函数,需要在解码类中声明,此函数不需要实现。
-
signals:
-
void sig_GetOneFrame(QImage img);
然后初始化时连接信号槽即可:
-
m_VideoDecode =
new CDemuxingDecoding;
-
connect(m_VideoDecode, SIGNAL(sig_GetOneFrame(QImage)), ui.showCurrentPicLabel, SLOT(slotGetOneFrame(QImage)));