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

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

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; //滑動(dòng)速度,值越大越快
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è)置滾動(dòng)延遲,多少ms滾動(dòng)多少像素點(diǎn)
void setText(QString text,QRgb textColor,float speed=0.70,int blankSuffix=20); //設(shè)置字體,調(diào)用該函數(shù)后,將會(huì)自動(dòng)啟動(dòng)定時(shí)器來(lái)滾動(dòng)字幕
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è)置滾動(dòng)延遲,多少ms滾動(dòng)多少像素點(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)字幕無(wú)間隙滾動(dòng)效果的文章就介紹到這了,更多相關(guān)Qt字幕無(wú)間隙滾動(dòng)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語(yǔ)言代碼實(shí)現(xiàn)簡(jiǎn)單2048游戲
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)2048游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-12-12
使用代碼驗(yàn)證linux子進(jìn)程與父進(jìn)程的關(guān)系
Linux下父進(jìn)程可以使用fork 函數(shù)創(chuàng)建子進(jìn)程,但是當(dāng)父進(jìn)程先退出后,子進(jìn)程會(huì)不會(huì)也退出呢?通過(guò)下面這個(gè)小實(shí)驗(yàn),我們能夠很好的看出來(lái)2014-02-02
C++實(shí)現(xiàn)LeetCode(68.文本左右對(duì)齊)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(68.文本左右對(duì)齊),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07
C語(yǔ)言植物大戰(zhàn)數(shù)據(jù)結(jié)構(gòu)二叉樹(shù)遞歸
這篇文章主要為大家介紹了C語(yǔ)言植物大戰(zhàn)數(shù)據(jù)結(jié)構(gòu)二叉樹(shù)遞歸,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05
基于Matlab實(shí)現(xiàn)嗅覺(jué)優(yōu)化算法的示例代碼
嗅覺(jué)劑優(yōu)化是一種新穎的優(yōu)化算法,旨在模仿氣味分子源尾隨的藥劑的智能行為。本文將利用Matlab實(shí)現(xiàn)這一智能優(yōu)化算法,需要的可以參考一下2022-05-05
C語(yǔ)言實(shí)現(xiàn)共享單車(chē)管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)共享單車(chē)管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08

