利用QTimer实现字幕滚动功能,可以实现自行更改文本内容、自适应文本大小、自由调整速度等功能。
新建一个Qt案例,项目名称为“TextScroll”,基类选择“QWidget”,取消创建UI界面复选框的选中状态,完成项目创建。
无UI界面
声明私有变量和事件:
private:
QTimer* timer; //时间定时器
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:
void setDelay(int ms,int pixelSize); //设置滚动延迟,多少ms滚动多少像素点
void setText(QString text,QRgb textColor,float speed=0.70,int blankSuffix=20); //设置字体,调用该函数后,将会自动启动定时器来滚动字幕
//void restart();
public slots:
void timeOut();
主函数内容如下:
resize(600,100);//调整窗口大小
timer = new QTimer(this);//创建定时器
connect(timer, SIGNAL(timeout()), this, SLOT(timeOut()));
QString text="人生百相,世态万千,悲悲喜喜,才构成了人生的完美;谋事在人,成事在天。"
"做过的事不要后悔。经常可以看到不少人自怨自艾,"
"为曾经做过的错事后悔不已,为过去的事而消沉,为过去的事而落魄。世上永远没有后悔药。";
QRgb textColor=qRgb(67,142,219);//字体颜色——蓝色
float speed=0.4;
int blankSuffix=0;
setText(text,textColor,speed,blankSuffix);
timeOut()槽函数:
//槽函数
void Widget::timeOut(){
qDebug()<<m_moveOffset<<m_moveSize;
m_moveOffset+=m_pixelSize;
if(m_moveOffset>m_moveSize)
{
m_moveOffset= 0;
}
update();
}
调整窗口大小resizeEvent事件:
void Widget::resizeEvent(QResizeEvent *event)
{
font.setPixelSize(event->size().height()*0.75);//字体大小(这里设置为窗口高度的0.75倍)
m_showText = m_text;
QFontMetrics metrics(font);
int char_w = metrics.horizontalAdvance(" ");//Qt5.11之后,之前请用width()
setDelay(30,char_w*speed);//滚动延时
int blankLine =width()/char_w+1;
for(int i=0;i<blankLine;i++)
{
m_showText.insert(0," ");//开头插入blankLine个空格
}
m_moveSize=metrics.horizontalAdvance(m_showText)+blankSuffix;
m_moveOffset=0;
update();
}
重写绘制事件paintEvent:
//绘图事件
void Widget::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);//绘制文字,水平居左垂直居中
}
定义滚动延迟函数:
//设置滚动延迟,多少ms滚动多少像素点pixelSize
void Widget::setDelay(int ms,int pixelSize)
{
this->m_ms=ms;
this->m_pixelSize=pixelSize;
}
设置字体相关信息:
//设置字体相关信息(text:字体内容,textColor:颜色,speed:字体滚动速度,blankSuffix:留白大小)
void Widget::setText(QString text, QRgb textColor, float speed, int blankSuffix)
{
this->blankSuffix = blankSuffix;
this->speed = speed;
font.setFamily("Microsoft Yahei");//字体样式——微软雅黑
font.setPixelSize(height()*0.0001); //字体像素大小
this->textColor = textColor; //字体颜色
m_text = text; //文本内容
m_showText = m_text; //显示内容
//计算字符大小
QFontMetrics metrics(font);
int char_w = metrics.horizontalAdvance(" ");//Qt5.11之后,之前请用width()
setDelay(50,char_w*speed);//调用setDelay()函数,设置滚动延时
int blankLine =width()/char_w+2;//
for(int i=0;i<blankLine;i++)
{
m_showText.insert(0," ");//开头插入blankLine个空格
}
m_moveSize=metrics.horizontalAdvance(m_showText)+blankSuffix;
m_moveOffset=0;
//如果计时器没有运行
if(!timer->isActive())
{
if(m_ms)
{
timer->start(m_ms);//启动计时,以m_ms为间隔
}
}
}
如果没有看懂的话,完整代码可以参考:https://download.csdn.net/download/didi_ya/75814629
ok,以上便是本文的全部内容了,如果对你有所帮助,记得点个赞哟~