想通过QSS实现更多效果的请搜索QT自带帮助文档
Qt Style Sheets Examples
,使用样式表来定制程序界面
原理
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210709162452934.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2NvcmVmdW5jdGlvbg==,size_16,color_FFFFFF,t_70#pic_center)
让label字母滚动起来的原理很简单
所以就是这么一个过程:
1,判断字符串的像素宽度是否超过窗体宽度,超过则开启滚动 (主要是开启定时器)
2,定时器固定毫秒去修改位移值left
,然后调用绘图事件
3,绘图事件根据left值,生成一个矩形(默认左上角为0,0),然后drawText
根据矩形绘画文本。由于left一直在变动,于是矩形也在不停变动,生成的文本也在不停变动,就实现了滚动字幕。
***定时器用的是定时器事件,适合用来处理比较简单的重复任务,具体可以看这里
代码
根据上面的分解,整个流程就很清晰了,public
继承QLabel
,第一步判断可以先从setText开始
需要注意的是,必须要设置label的窗口最大值。因为是否滚动的关键是判断是否超出this->with
,所以this->with
不能变动,一变动那触发滚动的阈值也变动了。
void label_scroll::setText(const QString &txt)
{
if(Qt::mightBeRichText(txt))
flag = 0;
else
flag = 1;
QLabel::setText(txt);
upateLabelRollingState();
}
upateLabelRollingState();
// 这个函数就是判断是否开启滚动的关键核心,计算文本像素长度和开启定时器
void label_scroll::upateLabelRollingState()
{
QFont ft = font();
QFontMetrics fm(ft);
#if QT_VERSION > QT_VERSION_CHECK(5,11,0)
text_wpixel = fm.horizontalAdvance(text() );
#else
text_wpixel = fm.width(text() );
#endif
if( (text_wpixel > this->width() ) && flag == 1 )
{
left = 0;
#if QT_VERSION > QT_VERSION_CHECK(5,11,0)
blank = " ";
blank_wp = fm.horizontalAdvance(blank );
#else
blank = " ";
blank_wp = fm.width(blank );
#endif
timerId = startTimer(speedt);
}
else
{
flag = 0;
if(timerId >= 0){
killTimer(timerId);
timerId = -1;
}
}
}
开启定时器之后,重载定时器事件timerEvent
,负责按时修改位移值left
void label_scroll::timerEvent(QTimerEvent *e)
{
if(e->timerId() == timerId && isVisible())
{
left += spixel;
if((left + 20) > (text_wpixel + blank_wp) )
left = 1-( this->width() );
update();
}
QLabel::timerEvent(e);
}
重载绘图事件,根据timerEvent
修改的位移值left
绘制矩形,再根据矩形位置绘画字符串
void label_scroll::paintEvent(QPaintEvent *e)
{
if(flag == 0){
QLabel::paintEvent(e);
return;
}
QPainter pen(this);
QRect rc = rect();
rc.setHeight(rc.height() );
rc.setWidth(rc.width() );
QString strText = blank + text();
rc.setLeft(rc.left() - left);
pen.drawText(rc,Qt::AlignVCenter, strText);
}
完整源码 + 部件提升
.h
文件
#ifndef LABEL_SCROLL_H
#define LABEL_SCROLL_H
#include <QDebug>
#include <QLabel>
#include <QTimerEvent>
#include <QPaintEvent>
#include <QTextDocument>
#include <QPainter>
class label_scroll :public QLabel
{
Q_OBJECT
public:
explicit label_scroll(QWidget *parent = nullptr);
~label_scroll();
void upateLabelRollingState();
public slots:
void timerEvent(QTimerEvent *e) Q_DECL_OVERRIDE;
void paintEvent(QPaintEvent *e) Q_DECL_OVERRIDE;
void setText(const QString &txt);
void setPixmap(const QPixmap &pix);
void resizeEvent(QResizeEvent *e) Q_DECL_OVERRIDE;
void setspeed(int sp=10,int st=300);
private:
int timerId;
int text_wpixel;
int speedt;
int spixel;
int left;
QString blank;
int blank_wp;
int start_scroll;
uint8_t flag;
};
#endif
.cpp
文件
#include "label_scroll.h"
label_scroll::label_scroll(QWidget *parent):QLabel(parent)
{
timerId = -1;
text_wpixel = 0;
speedt = 80;
spixel = 10;
flag = 0;
}
label_scroll::~label_scroll()
{
if(timerId >= 0)
killTimer(timerId);
}
void label_scroll::setText(const QString &txt)
{
if(Qt::mightBeRichText(txt))
flag = 0;
else
flag = 1;
QLabel::setText(txt);
upateLabelRollingState();
}
void label_scroll::setPixmap(const QPixmap &pix)
{
flag=0;
QLabel::setPixmap(pix);
}
void label_scroll::resizeEvent(QResizeEvent *e)
{
QLabel::resizeEvent(e);
upateLabelRollingState();
}
void label_scroll::setspeed(int sp,int st)
{
spixel = sp;
speedt = st;
upateLabelRollingState();
}
void label_scroll::upateLabelRollingState()
{
QFont ft = font();
QFontMetrics fm(ft);
#if QT_VERSION > QT_VERSION_CHECK(5,11,0)
text_wpixel = fm.horizontalAdvance(text() );
#else
text_wpixel = fm.width(text() );
#endif
if( (text_wpixel > this->width() ) && flag == 1 )
{
left = 0;
#if QT_VERSION > QT_VERSION_CHECK(5,11,0)
blank = " ";
blank_wp = fm.horizontalAdvance(blank );
#else
blank = " ";
blank_wp = fm.width(blank );
#endif
qDebug()<< "OK!";
timerId = startTimer(speedt);
}
else
{
qDebug()<< "no OK!";
flag = 0;
if(timerId >= 0){
killTimer(timerId);
timerId = -1;
}
}
}
void label_scroll::timerEvent(QTimerEvent *e)
{
if(e->timerId() == timerId && isVisible())
{
left += spixel;
if((left + 20) > (text_wpixel + blank_wp) )
left = 1-( this->width() );
update();
}
QLabel::timerEvent(e);
}
void label_scroll::paintEvent(QPaintEvent *e)
{
if(flag == 0){
QLabel::paintEvent(e);
return;
}
QPainter pen(this);
QRect rc = rect();
rc.setHeight(rc.height() );
rc.setWidth(rc.width() );
QString strText = blank + text();
rc.setLeft(rc.left() - left);
pen.drawText(rc,Qt::AlignVCenter, strText);
}
然后在UI设计师里面提升一下需要滚动的label部件
即可
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210709163636753.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2NvcmVmdW5jdGlvbg==,size_16,color_FFFFFF,t_70#pic_center)
参考文章
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)