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

本文介绍如何在Qt的QLabel控件上显示图片,并通过重写paintEvent方法实现在图片上绘制矩形框的功能。文章强调了调用父类paintEvent方法的重要性,并提供了具体的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        通常我们会在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 上绘制矩形 要在 `QLabel` 控件上绘制矩形,通常的做法是通过自定义子类化 `QLabel` 并重写其 `paintEvent()` 方法,在该方法内部使用 `QPainter` 进行绘图操作。下面是一个具体的例子说明如何实现这一点。 #### 创建自定义的 QLabel 类 首创建一个新的类继承于 `QLabel` ,在这个新的类里头重新实现了 `paintEvent` 函数用于处理绘逻辑[^4]: ```cpp class MyLabel : public QLabel { protected: void paintEvent(QPaintEvent *event) override; }; ``` #### 实现 paintEvent 函数 接着是在这个新类中具体实现 `paintEvent` 函数的内容。这里设置了一个红色笔触宽度为2像素的笔,并指定要绘制的矩形位置和大小参数 (x, y, w, h),最后调用 `drawRect` 来完成实际的绘制工作: ```cpp void MyLabel::paintEvent(QPaintEvent *event) { QLabel::paintEvent(event); // 调用基类版本以确保正常显示背景图像等内容 QPainter painter(this); QPen pen(Qt::red, 2); painter.setPen(pen); int x = 50; // 假设起始坐标X=50 int y = 50; // Y=50 int width = 100; // 宽度W=100 int height = 80; // 高度H=80 painter.drawRect(x, y, width, height); } ``` 需要注意的是如果希望在带有图片的 `QLabel` 上面覆盖绘制,则应该避免直接调用 `setPixmap()` 设置图片,而是采用 `QPainter::drawPixmap()` 的方式加载底图,这样可以防止后续绘制的操作被遮盖住[^3]。 以上就是关于怎样在一个基于 Qt 框架的应用程序里的 `QLabel` 组件之上添加矩形绘制功能的一个简单介绍以及相应代码片段展示。
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值