Qt 在QLabel上画图

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情

QT之所以不能再任意控件上绘图,是因为QT的事件过滤器把控件的绘图事件给过滤了。

在paintevent()函数中,通常需要设置QPainter对象,创建QPainter对象的同时需要指定绘图设备,即继承自QPainterDevice的子类作为绘图设备,绘制出来的图形将在这个设备上进行显示,Qt一共提供了4个这样的类,分别是QPixmap,QBitmap,QImage,和QPicture。

在控件上绘图又应该怎么办呢,我这以QLabel为例:使用事件过滤器来使QLabel对象捕获QEvent::Paint事件。即,绘图函数不需要放在paintevent()函数中也可以实现绘图。 实现这个功能的主要函数就还是事件过滤器的两个重要函数,即installEventFilter()和eventFileter() 。

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QPainter>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = nullptr);
    ~Widget();

protected:
    bool eventFilter(QObject *obj, QEvent *event);
    void labelPaint();
private:
    Ui::Widget *ui;
};

#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    ui->label->installEventFilter(this); //这行不能省
}

Widget::~Widget()
{
    delete ui;
}

bool Widget::eventFilter(QObject *watched, QEvent *event)   //用过滤器eventFilter()拦截QLabel中的QEvent::Paint事件
{
    if(watched ==ui->label && event->type() == QEvent::Paint)
        paint();

    return QWidget::eventFilter(watched,event);
}

void Widget::paint()     //绘图
{
    QPainter painter(ui->label);
    painter.setPen(Qt::blue);
   // painter.drawLine(100,100,200,200);
    painter.drawEllipse(30,15,50,65);
    painter.drawLine(0,100,111,100);

}
QLabel里绘制线段 之前在工作的过程中遇到了这种情况,需要在表盘内显示当前角度,但Qt不能直接在QLabel里绘制,要重写QLabel且需要重写paintEvent,网上大多数都是通过鼠标点击来触发paintEvent,我这种脑子不灵光的人着实费了些功夫,在此贴上代码,作为巩固,也作为分享。 (PS,之前在ui界面有MyLabel的情况下又new了一个MyLabel,结果冲突了,怎么绘制都没反应,实在是太呆了) 首先,重写QLabel MyLabel MyLabel.h #include <QPainter> # 阅读详情

相关推荐

Qt 5 重写QLabel实现在QLabel上勾画不规则闭合图形的功能

FPoint .h #ifndef FPOINT_H #define FPOINT_H /** Peyton's Code **/ class FPoint { public: FPoint(float x, float y); float x, y; FPoint operator+(const FPoint& b) { return FPoint(x + b.x, y + b.y); } FPoint operator-(con

Peyton's Blog 754

QLabel等控件上绘图

由于无法直接在QLabel上进行绘图,所以需要通过几种其它的方式来进行处理绘图情况 一、主函数中通过自定义控件绘图 1、通过自定义控件触发信号,然后在主程序的槽函数中实现绘图 首先自定义控件所对应的类MyLabel,该类继承自类QLabel。 在该类中自定义用于触发绘图的信号StartPaint,并在该类中重写 paintEvent()函数。 在paintEvent()函数中来触发绘图的信号 emit StartPaint(); 然后在主程序中定义对应的槽函数PaintOnQLabel,用于接收到触发绘图

Jeffxu_lib的博客 4019

Qt实现在QLabel上显示图片并进行线条/矩形框/多边形的绘制

本文主要讲述了使用QPainter在QLabel上进行图片的显示,并使用事件过滤器让QLabel捕获QEvent::Paint事件,并结合鼠标事件实现在图片上绘制其它图形。

XCJandLL的博客 8936

QT如何在控件上绘图(例如QLabel,Button,QWidget等)

自己定义一个MyWidget类继承于QWidget,然后在这个类中重写paintEvent(QPaintEvent *)函数,并在里面绘图。总结: 由上看出,绘图事件里的实现代码,与事件过滤里的实现代码是一样的,所以,完全可以将其封装成为函数。由两个函数组成的一种操作,用来完成一个部件对其他部件的事件监视,这两个函数分别是installEventFilter();event->type() == QEvent::Paint 判断的是绘图事件。示例:要在Form窗口里的 widget(红框部分) 中绘图。

qq_58136559的博客 5902

Qt 实现在QLabel画图

Qt之所以不能在任意控件上绘图,是因为Qt的事件过滤器把控件的绘图事件给过滤了。 如果想要在控件上绘图又应该怎么办呢,我这以QLabel为例:使用事件过滤器来使QLabel对象捕获QEvent::Paint事件。绘图函数不需要放在 paintevent() 函数中也可以实现绘图。 实现这个功能的主要函数就还是事件过滤器的两个重要函数,即 installEventFilte() 和even...

weixin_30920513的博客 1190

QT 实现在QLabel画图

QT之所以不能再任意控件上绘图是因为QT的事件过滤器把控件的绘图事件给过滤了。 在paintevent()函数中,通常需要设置QPainter对象,创建QPainter对象的同时需要指定绘图设备,即继承自QPainterDevice的子类作为绘图设备,绘制出来的图形将在这个设备上进行显示,Qt一共提供了4个这样的类,分别是QPixmap,QBitmap,QImage,和QPicture。 在控件上...

li7720681的博客 4171

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

QT中在QLabel显示图片并且利用鼠标点击画线 https://blog.csdn.net/binleebit/article/details/75949211 Qt中在label上载入图片后在上面画矩形框的方法 https://www.it610.com/article/3860174.htm 实际使用: Qt自定义控件的创建与初步使用(二)之图片上绘制文字、箭头、曲线 https://blo...

爱她就要努力 9207

qt qlabel使用html,Qt 实现在QLabel画图

Qt之所以不能在任意控件上绘图,是因为Qt的事件过滤器把控件的绘图事件给过滤了。如果想要在控件上绘图又应该怎么办呢,我这以QLabel为例:使用事件过滤器来使QLabel对象捕获QEvent::Paint事件。绘图函数不需要放在 paintevent() 函数中也可以实现绘图。 实现这个功能的主要函数就还是事件过滤器的两个重要函数,即 installEventFilte() 和eventFilet...

weixin_28875235的博客 662

Qt 加载图片到QLabel上并进行画图

看了很多网上是文字大部分都是继承QLabel写一个类,但是如果小型项目没有必要写一个类,就可以写一个函数,或者直接在鼠标事件mousePressEvent、mouseReleaseEvent、mouseMoveEvent直接去实现,另外有些在更改后没有调用ui->Label->setPixmap(pix)这个语句,因此无法实时更新到窗口。 void Dialog::myfunc...

lxj362343的博客 3668

QT封装qlabel可以实现画图画图拖动

#ifndef CMYLABEL_H #define CMYLABEL_H #include #include #include #include #include class CMyLabel : public QLabel { Q_OBJECT public: //鼠标拖动当前特征点 int n; QList m_listCenter;//存储中心点坐标 bool

du_bingbing的博客 2930

QT 关于QPainter在QLabel画图无法显示的一种情况

最近学校安排写一个五子棋的网络游戏,在QLabel上使用 .setPixmap() 绘制了棋盘,然后用 QPainter.drawPixmap() 在棋盘上绘制棋子,遇到棋子无法显示在棋盘上的问题,查阅很多资料没有问题,后来自己写了个实验程序发现问题所在。 原因:QLabel.setPixmap() 设置的图片会显示在最上层,QPainter.drawPixmap() 绘制的棋子被遮挡住了 解决方法:棋盘也使用QPainter.drawPixmap()进行绘制 关于在QLabel上绘图,参考博客:http

little_boyyy的博客 6474

Qt6图片上画点线使用qlabel的draw pixmap

先在qlabel上使用drawpixmap画图片。不是setpixmap,而是drawpixmap。setpixmap只是设置背景的,不是画图的。drawpixmap才是画图的。然后就可以画点,划线了。

邹九的个人博客 208

Qt 中实现在控件中点击鼠标,就在鼠标点击处加载图片的方法

首先应该知道,QLabel类是没有点击事件的。我们需要点击鼠标,那么必须重写一个QLabel类去继承原来的QLabel。比如说我定义PutPicLabel来继承QLabel。 在头文件中应该这么写: #ifndef PUTPICLABEL_H #define PUTPICLABEL_H #include #include #include #include #include #in

hanzhen7541的博客 2890

Qt开发过程中的一些解决方案

Qt开发过程中的一些解决方案

m0_63550153的博客 454

QT中显示GIF图片

QT中要显示GIF图片,不能通过单单的添加部件来完成. 还需要手动的编写程序. 工具:QT Creator 新建一个工程,我们先在designer中,添加一个QLabel部件. 如下图: 将QLabel拉成适当大小. 在类cpp函数中添加如下程序: #include "widget.h" #include "ui_widget.h" #i

jack_bro的博客 1万+

Qlabel添加动图

QLabel *label = new QLabel(); QMovie *movie = new QMovie("D:/Project/Qt/firstQT/2.gif"); label->setMovie(movie); movie->start(); label->show();

liuyanfeier的专栏 1335
上一篇: 继承QLabel, 然后在paintEvent中画
蓝亚
博客等级 码龄7年 6粉丝 2原创
评论 9
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值