之前在工作的过程中遇到了这种情况,需要在表盘内显示当前角度,但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新手,共同学习,如果大家有好的建议或者可以改进的地方,也希望各位慷慨解囊,感激不尽。