在QLabel里绘制线段

本文介绍了在Qt环境下,如何通过重写QLabel类并实现paintEvent方法来实现在QLabel内部绘制线段。作者分享了自己的学习过程和遇到的问题,如在UI中同时存在MyLabel实例时导致的冲突,并鼓励QT新手一起交流学习。

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

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

首先,重写QLabel MyLabel

MyLabel.h

#include <QPainter>
#include <QPoint>
#include <QColor>
#include <QPen>
#include <QDebug>
#include "prt_data.h"

class MyLabel : public QLabel
{
    Q_OBJECT
public:
    MyLabel(QWidget *parent);
    //重写绘制事件
    virtual void paintEvent(QPaintEvent *event) override;
    //获取线段终点
    void getLineEndPoint();
    QPoint getStartPoint();
    QPoint getEndPoint();
    void setLineColor(const QColor lineColor);
    void setLineSize(const int lineSize);
     void clear();
private:
     QVector<QPoint> pointList; //保存各个线段的终点

    QPoint StartPoint;          //画线起点
    QPoint EndPoint;            //画线终点
    QColor lineColor;               //线条颜色
    int lineSize;                  //5种线型

    bool drawline = false;          //用于判断是否执行绘图
};

#endif // MYLABEL_H

MyLabel.cpp

#include "mylabel.h"

MyLabel::MyLabel(QWidget *parent):QLabel (parent)
{
    this->StartPoint = QPoint(0,0);
        this->EndPoint = QPoint(0,0);
        this->lineColor = QColor(Qt::blue);
        this->lineSize = 2;
}

//绘制事件
void MyLabel::paintEvent(QPaintEvent *event)
{
    QLabel::paintEvent(event);//必须有,才能让背景图片显示出来
    QPainter painter(this);
    QPen pen;
    pen.setColor(Qt::blue);
    pen.setWidth(2);
    painter.setPen(pen);

    //qDebug()<<StartPoint.x()<< ";" << StartPoint.y();
    qDebug()<<EndPoint.x()<< ";" << EndPoint.y();
    qDebug()<<stopghs;


    for(int i = 0;i<pointList.size();i++)
    {
        painter.drawLine(QLine(StartPoint.x(), StartPoint.y(), pointList[i].x(),pointList[i].y()));
        qDebug()<<i;
    }

}

//确定线段起点/终点并触发paintEvent事件
void MyLabel::getLineEndPoint()
{
	//起点固定
    StartPoint.setX(115);
    StartPoint.setY(112);
    
    //终点计算函数,略
    EndPoint.setX(stopx);
    EndPoint.setY(stopy);

    pointList.push_back(EndPoint);
    //将点存入vector,在每次绘制线段的时候绘制所有线段,否则只会绘制当前线段
    update();//用于调用paintEvent
}

通过建立MyLabel指针,调用计算起点、终点函数

MyLabel *onedir_label_clock;
------------------------------------------------
void prt_onedirection::onedirection_StopPoint()
{
    onedir_label_clock->getLineEndPoint();
}

QT新手,共同学习,如果大家有好的建议或者可以改进的地方,也希望各位慷慨解囊,感激不尽。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值