Qt實(shí)現(xiàn)字幕無間隙滾動效果
1.描述
最近要實(shí)現(xiàn)一個(gè)滾動條字幕,但是搜到的系列文章都是利用定時(shí)器QTimer,在固定的時(shí)間截取文本并顯示,這樣滾動的時(shí)候其實(shí)是斷斷續(xù)續(xù)的,因?yàn)閷?shí)際上是一個(gè)個(gè)字符位移實(shí)現(xiàn)的,不過實(shí)現(xiàn)方便.
所以只有自己實(shí)現(xiàn)無間隙滾動條字幕.
2.界面展示
示例如下圖所示:

效果圖如下所示(支持自適應(yīng)主界面大小,根據(jù)主界面窗口變換,自動更正文本大小,速度):

3.代碼實(shí)現(xiàn)
頭文件
#ifndef TEXTSCROLL_H
#define TEXTSCROLL_H
#include <QObject>
#include <QWidget>
#include <QTimer>
#include <QPainter>
#include <QFontMetrics>
#include <QResizeEvent>
class textScroll : public QWidget
{
Q_OBJECT
private:
QTimer* timer; //時(shí)間定時(shí)器
QRgb textColor;
QString m_text;
QString m_showText;
QFont font;
int m_ms;
int m_pixelSize;
int m_moveOffset;
int m_moveSize;
int blankSuffix;
float speed; //滑動速度,值越大越快
void paintEvent(QPaintEvent *event);
void resizeEvent(QResizeEvent *event);
public:
explicit textScroll(QWidget *parent = 0); //qRgb(int r, int g, int b)
void setDelay(int ms,int pixelSize); //設(shè)置滾動延遲,多少ms滾動多少像素點(diǎn)
void setText(QString text,QRgb textColor,float speed=0.70,int blankSuffix=20); //設(shè)置字體,調(diào)用該函數(shù)后,將會自動啟動定時(shí)器來滾動字幕
void restart();
signals:
public slots:
void timeOut();
};
#endif // TEXTSCROLL_H源文件
#include "textscroll.h"
#include <QDebug>
textScroll::textScroll( QWidget *parent) : QWidget(parent)
{
timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(timeOut()));
}
void textScroll::timeOut()
{
qDebug()<<m_moveOffset<<m_moveSize;
m_moveOffset+=m_pixelSize;
if(m_moveOffset>m_moveSize)
{
m_moveOffset= 0;
}
update();
}
void textScroll::resizeEvent(QResizeEvent *event)
{
font.setPixelSize(event->size().height()*0.75);
m_showText = m_text;
QFontMetrics metrics(font);
int char_w = metrics.width(" ");
setDelay(30,char_w*speed);
int blankLine =width()/char_w+1;
for(int i=0;i<blankLine;i++)
{
m_showText.insert(0," ");
}
m_moveSize=metrics.width(m_showText)+blankSuffix;
m_moveOffset=0;
update();
}
void textScroll::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
painter.setFont(font);
painter.setPen(QColor(120,120,120));
painter.drawRect(QRect(0,0,width()-1,height()-1));
painter.setPen(QColor(textColor));
painter.drawText(QRect(-m_moveOffset,0,width()-1+m_moveOffset,height()-1),
Qt::AlignVCenter|Qt::AlignLeft,m_showText);
}
void textScroll::setDelay(int ms,int pixelSize) //設(shè)置滾動延遲,多少ms滾動多少像素點(diǎn)
{
this->m_ms=ms;
this->m_pixelSize=pixelSize;
}
void textScroll::setText(QString text, QRgb textColor, float speed, int blankSuffix) //設(shè)置字體
{
this->blankSuffix = blankSuffix;
this->speed = speed;
font.setFamily("Microsoft Yahei");
font.setPixelSize(height()*0.75);
this->textColor = textColor;
m_text = text;
m_showText = m_text;
QFontMetrics metrics(font);
int char_w = metrics.width(" ");
setDelay(50,char_w*speed);
int blankLine =width()/char_w+2;
for(int i=0;i<blankLine;i++)
{
m_showText.insert(0," ");
}
m_moveSize=metrics.width(m_showText)+blankSuffix;
m_moveOffset=0;
if(!timer->isActive())
{
if(m_ms)
{
timer->start(m_ms);
}
}
}
void textScroll::restart()
{
m_moveOffset=0;
update();
}到此這篇關(guān)于Qt實(shí)現(xiàn)字幕無間隙滾動效果的文章就介紹到這了,更多相關(guān)Qt字幕無間隙滾動內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用代碼驗(yàn)證linux子進(jìn)程與父進(jìn)程的關(guān)系
Linux下父進(jìn)程可以使用fork 函數(shù)創(chuàng)建子進(jìn)程,但是當(dāng)父進(jìn)程先退出后,子進(jìn)程會不會也退出呢?通過下面這個(gè)小實(shí)驗(yàn),我們能夠很好的看出來2014-02-02
C++實(shí)現(xiàn)LeetCode(68.文本左右對齊)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(68.文本左右對齊),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07
C語言植物大戰(zhàn)數(shù)據(jù)結(jié)構(gòu)二叉樹遞歸
這篇文章主要為大家介紹了C語言植物大戰(zhàn)數(shù)據(jù)結(jié)構(gòu)二叉樹遞歸,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05
基于Matlab實(shí)現(xiàn)嗅覺優(yōu)化算法的示例代碼
嗅覺劑優(yōu)化是一種新穎的優(yōu)化算法,旨在模仿氣味分子源尾隨的藥劑的智能行為。本文將利用Matlab實(shí)現(xiàn)這一智能優(yōu)化算法,需要的可以參考一下2022-05-05
C語言實(shí)現(xiàn)共享單車管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)共享單車管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08

