QT label完美版滚动字幕,跑马灯
特点:可以调速,不掉帧,众享丝滑.
cpp
#include "xlabel.h"
XLabel::XLabel(QWidget *p):
m_translation(0)
{
connect(&m_timer,&QTimer::timeout,this,&XLabel::onTimeOut);
}
XLabel::XLabel(QString &text, QWidget *p):
m_text(text),
m_translation(0)
{
connect(&m_timer,&QTimer::timeout,this,&XLabel::onTimeOut);
repaint();
}
void XLabel::paintEvent(QPaintEvent *e)
{
QWidget::paintEvent(e);
QFontMetrics fMetrics(this->font());
int textW = fMetrics.width(m_text);
QPainter painter(this);
QPen pen;
pen.setColor("#545454");
pen.setWidth(2);
painter.setPen(pen);
painter.translate(0 - m_translation,0);
painter.drawText(0,fMetrics.height()-3,m_text.toUtf8());
painter.resetMatrix();
if(textW > this->width())
{
painter.translate(textW - m_translation + 20,0);
painter.drawText(0,fMetrics.height()-3,m_text.toUtf8());
painter.resetMatrix();
}
}
void XLabel::setText(QString text)
{
this->setFixedHeight(25);
QFont font;
font.setPixelSize(15);
font.setFamily("Microsoft YaHei");
this->setFont(font);
m_text = text;
repaint();
}
QString XLabel::text()
{
return m_text;
}
void XLabel::onTimeOut()
{
//计算移动权值
QFontMetrics fMetrics(this->font());
int textW = fMetrics.width(m_text);
if((textW) > m_translation)
{
m_translation += 1;
}
else
{
m_translation = -19;
}
update();
}
void XLabel::mousePressEvent(QMouseEvent *ev)
{
if(ev->button() == Qt::LeftButton)//点击左键是选中
{
QWidget *tempWidget=this->parentWidget();
tempWidget->setObjectName("tempWidget");
tempWidget->setStyleSheet("#tempWidget{border: 1px solid #99d0ae; border-radius: 15px;background-color:#99d0ae; color:#545454;font-size:15px;font-family:Microsoft YaHei;}");
this->setStyleSheet("#tempLabel{background-color:#99d0ae; color:#545454;font-size:15px;font-family:Microsoft YaHei;}");
//计算字体宽度
QFontMetrics fMetrics(this->font());
int textW = fMetrics.width(m_text);
if(textW > this->width())//如果字体宽度大于tihs开始滚动
{
m_timer.start(30);
}
else
{
m_timer.stop();
}
this->repaint();
qDebug()<<".....";
emit signClicked();
}
else if(ev->button() == Qt::RightButton)//点击右键是操作
{
QMenu menu;
menu.addAction("修改", this, SIGNAL(sigAlter()));
menu.addAction("删除", this, SIGNAL(signDle()));
menu.setStyleSheet("background-color:#99d0ae;color:rgb(100,100,100)");
menu.exec(QCursor::pos());
}
}
void XLabel::setOver()
{
m_timer.stop();
m_translation = 0;
update();
}
.h
#ifndef XLabel_H
#define XLabel_H
#include <QLabel>
#include <QPainter>
#include <QFontMetrics>
#include <QTimer>
#include <QDebug>
#include "QMouseEvent"
#include "QMenu"
class XLabel : public QLabel
{
Q_OBJECT
public:
XLabel(QWidget *p = nullptr);
XLabel(QString &text , QWidget *p = nullptr);
void paintEvent(QPaintEvent *e) override;
void mousePressEvent(QMouseEvent *ev) override;
//复原
void setOver();
public:
//设置数据
void setText(QString text);
//获取数据
QString text();
public slots:
//计算权值
void onTimeOut();
signals:
//左键点击事件
void signClicked();
void signDle();
void sigAlter();
private:
QString m_text;
QTimer m_timer;
int m_translation;
QPen m_paniterPen;
QFont m_font;
};
#endif // XLabel_H