qt中在QLabel上显示图像并画图

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


  
  
  1. #ifndef MYLABEL_H
  2. #define MYLABEL_H
  3. #include <QLabel>
  4. #include <QPoint>
  5. #include <QColor>
  6. #include <QPaintEvent>
  7. #include <QImage>
  8. #include <QPixmap>
  9. class myLabel : public QLabel
  10. {
  11. //Q_OBJECT
  12. public:
  13. myLabel();
  14. //~myLabel();
  15. //绘制线条
  16. virtual void paintEvent(QPaintEvent *event) override;
  17. //鼠标按下
  18. void mousePressEvent(QMouseEvent *e);
  19. //鼠标移动
  20. void mouseMoveEvent(QMouseEvent *e);
  21. //鼠标抬起
  22. void mouseReleaseEvent(QMouseEvent *e);
  23. //设置所画线条属性
  24. void setLineColor(const QColor lineColor);
  25. void setLineSize(const int lineSize);
  26. //得到画线的起点和终点
  27. QPoint getStartPoint();
  28. QPoint getEndPoint();
  29. void clear();
  30. private:
  31. QPoint lineStartPoint; //画线起点
  32. QPoint lineEndPoint; //画线终点
  33. QColor lineColor; //线条颜色
  34. int lineSize; //5种线型
  35. bool isPressed;
  36. };
  37. #endif // MYLABEL_H

myLabel.cpp


  
  
  1. #include "myLabel.h"
  2. #include <QPen>
  3. #include<QPainter>
  4. myLabel::myLabel()
  5. {
  6. this->lineStartPoint = QPoint( 0, 0);
  7. this->lineEndPoint = QPoint( 0, 0);
  8. this->lineColor = QColor(Qt::black);
  9. this->lineSize = 3;
  10. }
  11. //绘制线条
  12. void myLabel::paintEvent(QPaintEvent *event)
  13. {
  14. QLabel::paintEvent(event); //必须有,才能让背景图片显示出来
  15. QPainter painter(this);
  16. QPen pen;
  17. pen.setColor(lineColor);
  18. pen.setWidth(lineSize);
  19. painter.setPen(pen);
  20. painter.drawLine(lineStartPoint,lineEndPoint);
  21. }
  22. //鼠标按下
  23. void myLabel::mousePressEvent(QMouseEvent *e)
  24. {
  25. lineStartPoint = e->pos();
  26. lineEndPoint = e->pos();
  27. //在图片上绘制
  28. isPressed = true;
  29. }
  30. //鼠标移动
  31. void myLabel::mouseMoveEvent(QMouseEvent *e)
  32. {
  33. if(isPressed)
  34. {
  35. lineEndPoint=e->pos();
  36. update();
  37. }
  38. }
  39. //鼠标抬起
  40. void myLabel::mouseReleaseEvent(QMouseEvent *e)
  41. {
  42. isPressed= false;
  43. update();
  44. }
  45. void myLabel::setLineColor( const QColor lineColor)
  46. {
  47. this->lineColor = lineColor;
  48. }
  49. void myLabel::setLineSize( const int lineSize)
  50. {
  51. this->lineSize = lineSize;
  52. }
  53. QPoint myLabel::getStartPoint()
  54. {
  55. return lineStartPoint;
  56. }
  57. QPoint myLabel::getEndPoint()
  58. {
  59. return lineEndPoint;
  60. }
  61. void myLabel::clear()
  62. {
  63. lineStartPoint = QPoint( 0, 0);
  64. lineEndPoint = QPoint( 0, 0);
  65. update();
  66. }


Qt中在QLabel上载入图片后在上面画矩形框的方法

通常我们会在QLabel上显示图片(本文假设你已经会了,不会的话搜一下也很简单),但是有时候我们会需要在演示时在图片上画些东西。比如,我想显示我在图片上用鼠标选取的矩形框,即画一个红矩形框。这个问题说简单也简单,但是千万别小看它,我就曾被这个小问题折磨了一个周末,最后终于搞定,记录下分享给日后需要的朋友吧。先来张图展示下我们想达到的效果:

Qt中在QLabel上载入图片后在上面画矩形框的方法_第1张图片

        首先,需要子类化控件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


  
  
  1. # pragma execution_character_set(“utf-8”)
  2. #ifndef MYLABEL_H
  3. #define MYLABEL_H
  4. #include <list>
  5. #include <map>
  6. #include<QLabel>
  7. #include<QPoint>
  8. #include<QMouseEvent>
  9. #include<QPainter>
  10. #include<QWidget>
  11. #include<QDebug>
  12. #include<iostream>
  13. #include<QString>
  14. #include<QImage>
  15. using namespace std;
  16. #define WIDTH 640
  17. #define HEIGHT 360
  18. class MyLabel : public QLabel
  19. {
  20. Q_OBJECT
  21. public:
  22. MyLabel(QWidget *parent = 0);
  23. protected:
  24. void paintEvent(QPaintEvent *event);
  25. private slots :
  26. void slotGetOneFrame(QImage img);
  27. private:
  28. QImage wb_Image;
  29. };
  30. #endif // MYLABEL_H

mylabel.cpp


  
  
  1. #include “mylabel.h”
  2. MyLabel::MyLabel(QWidget *parent):QLabel(parent)
  3. {
  4. }
  5. //接收sig_GetOneFrame信号,调用update在界面中显示图像
  6. void MyLabel::slotGetOneFrame(QImage img)
  7. {
  8. wb_Image = img;
  9. update(); //调用update将执行 paintEvent函数
  10. }
  11. void MyLabel::paintEvent(QPaintEvent *event)
  12. {
  13. QLabel::paintEvent(event);
  14. //画出图像
  15. QPainter painter(this);
  16. if (wb_Image.size().width() <= 0) return;
  17. ///将图像按比例缩放成和窗口一样大小
  18. QImage img = wb_Image.scaled(QSize(WIDTH, HEIGHT), Qt::IgnoreAspectRatio);
  19. int x = this->width() - img.width();
  20. int y = this->height() - img.height();
  21. painter.drawImage(QPoint(x, y), img);
  22. // 画矩形框
  23. QPainter paint;
  24. paint.begin( this);
  25. paint.setPen(QPen(Qt::red, 1, Qt::SolidLine, Qt::RoundCap));
  26. paint.drawRect(QRect( 50, 50, 200, 200));
  27. QString strText = QString::fromLocal8Bit( “用双手成就你的梦想”);;
  28. paint.drawText( 250, 50, strText);
  29. paint.end();
  30. }

其中用到了信号槽,大家注意到头文件中


  
  
  1. private slots :
  2. void slotGetOneFrame(QImage img);

这是槽函数,还需要一个信号函数,需要在解码类中声明,此函数不需要实现。


  
  
  1. signals:
  2. void sig_GetOneFrame(QImage img);

然后初始化时连接信号槽即可:


  
  
  1. m_VideoDecode = new CDemuxingDecoding;
  2. connect(m_VideoDecode, SIGNAL(sig_GetOneFrame(QImage)), ui.showCurrentPicLabel, SLOT(slotGetOneFrame(QImage)));
发布了42 篇原创文章 · 获赞 148 · 访问量 41万+

猜你喜欢

转载自blog.csdn.net/baidu_37503452/article/details/104540130
今日推荐