QT中Label控件上显示图片后怎么画线

Night_rover 2015-10-17 12:52:23
RT,QT中Label控件上已经显示图片 怎么在上面实现画线操作 例如鼠标画框。
显示图片代码如下:
void Widget::openPictureSlot()
{
qDebug()<<"openpicture";
QImage *image=new QImage("E:/code/picture_test/images/imgMB.bmp");
QImage* imgScaled = new QImage;

*imgScaled=image->scaled(ui->label->width(),ui->label->height(),Qt::KeepAspectRatio);
ui->label->setPixmap(QPixmap::fromImage(*imgScaled));
}
...全文
5945 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
ooolinux 2018-05-18
  • 打赏
  • 举报
回复
引用 24 楼 u010165006 的回复:
[quote=引用 22 楼 nh5431313 的回复:] 貌似不是那么好使
参考: 为QLabel添加鼠标事件 https://blog.csdn.net/lmhuanying1012/article/details/78034733?fps=1&locationNum=10[/quote] 然后为几个信号添加槽函数。
ooolinux 2018-05-18
  • 打赏
  • 举报
回复
引用 22 楼 nh5431313 的回复:
貌似不是那么好使
参考: 为QLabel添加鼠标事件 https://blog.csdn.net/lmhuanying1012/article/details/78034733?fps=1&locationNum=10
楼兰公子 2018-05-18
  • 打赏
  • 举报
回复
引用 15 楼 binleebit 的回复:
(全是泪,之前写了一个回复,没登录CSDN,刷新之后编辑没有了) 最近在做在Label上显示图片并且画线,在网上查了很多零零散散的东西,收获也多(特别感谢楼上那位提出利用继承重新实现自己的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  //必须没有,要不然会报错,因为Label不是Widget等
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 setImage(const QImage &pic);

    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::setImage(const QImage &pic)
{
    this->setPixmap(QPixmap::fromImage(pic));
}

void myLabel::clear()
{
    lineStartPoint = QPoint(0,0);
    lineEndPoint = QPoint(0,0);
    update();
}
貌似不是那么好使
楼兰公子 2018-05-18
  • 打赏
  • 举报
回复
貌似不是那么好使
zca760945935 2017-10-27
  • 打赏
  • 举报
回复
请问楼主怎么解决的?我出现错误 错误提示是:no matching function for call to 'MyLabel::MyLabel(QWidget*&)' label = new MyLabel(Widget);
Leon_zm 2017-09-29
  • 打赏
  • 举报
回复
引用 19 楼 a5481115 的回复:
引用 16 楼 Leon_yy 的回复:
[quote=引用 14 楼 a5481115 的回复:] [quote=引用 13 楼 baidu_37495190 的回复:] 问题好久 了,我现在遇到了这个问题。楼主以前怎么解决的
层主解决了吗?求告知
层主你解决了吗?我也遇到了同样的问题。。。[/quote]解决了 加一个widget控件背景设置为透明,在widget上画线,明白我意思吗?[/quote]已经解决了,谢谢
yaui_niu 2017-09-28
  • 打赏
  • 举报
回复
引用 16 楼 Leon_yy 的回复:
引用 14 楼 a5481115 的回复:
[quote=引用 13 楼 baidu_37495190 的回复:] 问题好久 了,我现在遇到了这个问题。楼主以前怎么解决的
层主解决了吗?求告知
层主你解决了吗?我也遇到了同样的问题。。。[/quote]解决了 加一个widget控件背景设置为透明,在widget上画线,明白我意思吗?
yaui_niu 2017-09-28
  • 打赏
  • 举报
回复
解决了 加一个widget控件背景设置为透明,在widget上画线,明白我意思吗?
Leon_zm 2017-08-14
  • 打赏
  • 举报
回复
引用 13 楼 baidu_37495190 的回复:
问题好久 了,我现在遇到了这个问题。楼主以前怎么解决的
层主你解决了吗?我也遇到了同样的问题。。。
Leon_zm 2017-08-14
  • 打赏
  • 举报
回复
引用 14 楼 a5481115 的回复:
引用 13 楼 baidu_37495190 的回复:
问题好久 了,我现在遇到了这个问题。楼主以前怎么解决的
层主解决了吗?求告知
层主你解决了吗?我也遇到了同样的问题。。。
BITLBB 2017-07-23
  • 打赏
  • 举报
回复
(全是泪,之前写了一个回复,没登录CSDN,刷新之后编辑没有了) 最近在做在Label上显示图片并且画线,在网上查了很多零零散散的东西,收获也多(特别感谢楼上那位提出利用继承重新实现自己的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  //必须没有,要不然会报错,因为Label不是Widget等
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 setImage(const QImage &pic);

    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::setImage(const QImage &pic)
{
    this->setPixmap(QPixmap::fromImage(pic));
}

void myLabel::clear()
{
    lineStartPoint = QPoint(0,0);
    lineEndPoint = QPoint(0,0);
    update();
}
yaui_niu 2017-06-21
  • 打赏
  • 举报
回复
引用 13 楼 baidu_37495190 的回复:
问题好久 了,我现在遇到了这个问题。楼主以前怎么解决的
层主解决了吗?求告知
RobinYang0116 2017-02-19
  • 打赏
  • 举报
回复
问题好久 了,我现在遇到了这个问题。楼主以前怎么解决的
Night_rover 2015-10-26
  • 打赏
  • 举报
回复
引用 11 楼 fly_dragon_fly 的回复:
[quote=引用 10 楼 Night_rover 的回复:] [quote=引用 8 楼 fly_dragon_fly 的回复:] [quote=引用 7 楼 Night_rover 的回复:] [quote=引用 6 楼 fly_dragon_fly 的回复:] 继承一个QLabel, 然后在paintEvent中画
能详细说下吗?[/quote] 1 新建一个类比如 MyLabel, 继承于QLabel, 用向导生成即可 2 添加虚函数 virtual void paintEvent(QPaintEvent *) override 要画什么在这函数里面画. 3 然后双击ui文件打开设计器, 找到label, 在对象查看中右击类名称,选择提升, 里面填MyLabel, 保存ui, 重新生成就可以了[/quote] 我每次提升就出错了 错误出在label = new MyLabel(Widget);这句话 错误提示是:no matching function for call to 'MyLabel::MyLabel(QWidget*&)' label = new MyLabel(Widget); ^[/quote]你产生的MyLabel类中没有这个构造函数, [/quote] 什么意思啊?该怎么改?
fly_dragon_fly 2015-10-22
  • 打赏
  • 举报
回复
引用 10 楼 Night_rover 的回复:
[quote=引用 8 楼 fly_dragon_fly 的回复:] [quote=引用 7 楼 Night_rover 的回复:] [quote=引用 6 楼 fly_dragon_fly 的回复:] 继承一个QLabel, 然后在paintEvent中画
能详细说下吗?[/quote] 1 新建一个类比如 MyLabel, 继承于QLabel, 用向导生成即可 2 添加虚函数 virtual void paintEvent(QPaintEvent *) override 要画什么在这函数里面画. 3 然后双击ui文件打开设计器, 找到label, 在对象查看中右击类名称,选择提升, 里面填MyLabel, 保存ui, 重新生成就可以了[/quote] 我每次提升就出错了 错误出在label = new MyLabel(Widget);这句话 错误提示是:no matching function for call to 'MyLabel::MyLabel(QWidget*&)' label = new MyLabel(Widget); ^[/quote]你产生的MyLabel类中没有这个构造函数,
fly_dragon_fly 2015-10-21
  • 打赏
  • 举报
回复
引用 7 楼 Night_rover 的回复:
[quote=引用 6 楼 fly_dragon_fly 的回复:] 继承一个QLabel, 然后在paintEvent中画
能详细说下吗?[/quote] 1 新建一个类比如 MyLabel, 继承于QLabel, 用向导生成即可 2 添加虚函数 virtual void paintEvent(QPaintEvent *) override 要画什么在这函数里面画. 3 然后双击ui文件打开设计器, 找到label, 在对象查看中右击类名称,选择提升, 里面填MyLabel, 保存ui, 重新生成就可以了
Night_rover 2015-10-21
  • 打赏
  • 举报
回复
引用 8 楼 fly_dragon_fly 的回复:
[quote=引用 7 楼 Night_rover 的回复:] [quote=引用 6 楼 fly_dragon_fly 的回复:] 继承一个QLabel, 然后在paintEvent中画
能详细说下吗?[/quote] 1 新建一个类比如 MyLabel, 继承于QLabel, 用向导生成即可 2 添加虚函数 virtual void paintEvent(QPaintEvent *) override 要画什么在这函数里面画. 3 然后双击ui文件打开设计器, 找到label, 在对象查看中右击类名称,选择提升, 里面填MyLabel, 保存ui, 重新生成就可以了[/quote] 我每次提升就出错了 错误出在label = new MyLabel(Widget);这句话 错误提示是:no matching function for call to 'MyLabel::MyLabel(QWidget*&)' label = new MyLabel(Widget); ^
夜里的柚子 2015-10-21
  • 打赏
  • 举报
回复
继承QLabel~
Night_rover 2015-10-20
  • 打赏
  • 举报
回复
引用 6 楼 fly_dragon_fly 的回复:
继承一个QLabel, 然后在paintEvent中画
能详细说下吗?
fly_dragon_fly 2015-10-19
  • 打赏
  • 举报
回复
继承一个QLabel, 然后在paintEvent中画
加载更多回复(5)

24,854

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧