Qt實(shí)現(xiàn)字幕滾動(dòng)效果的示例代碼
一、項(xiàng)目介紹
利用QTimer實(shí)現(xiàn)字幕滾動(dòng)功能,可以實(shí)現(xiàn)自行更改文本內(nèi)容、自適應(yīng)文本大小、自由調(diào)整速度等功能。
二、項(xiàng)目基本配置
新建一個(gè)Qt案例,項(xiàng)目名稱為“TextScroll”,基類選擇“QWidget”,取消創(chuàng)建UI界面復(fù)選框的選中狀態(tài),完成項(xiàng)目創(chuàng)建。
三、UI界面設(shè)計(jì)
無UI界面
四、主程序?qū)崿F(xiàn)
4.1 widget.h頭文件
聲明私有變量和事件:
private: QTimer* timer; //時(shí)間定時(shí)器 QRgb textColor; //文本顏色 QString m_text; //文本內(nèi)容 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);
聲明函數(shù)和槽函數(shù):
public: 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í)器來滾動(dòng)字幕 //void restart(); public slots: void timeOut();
4.2 widget.cpp源文件
主函數(shù)內(nèi)容如下:
resize(600,100);//調(diào)整窗口大小 timer = new QTimer(this);//創(chuàng)建定時(shí)器 connect(timer, SIGNAL(timeout()), this, SLOT(timeOut())); QString text="人生百相,世態(tài)萬千,悲悲喜喜,才構(gòu)成了人生的完美;謀事在人,成事在天。" "做過的事不要后悔。經(jīng)??梢钥吹讲簧偃俗栽棺园?," "為曾經(jīng)做過的錯(cuò)事后悔不已,為過去的事而消沉,為過去的事而落魄。世上永遠(yuǎn)沒有后悔藥。"; QRgb textColor=qRgb(67,142,219);//字體顏色——藍(lán)色 float speed=0.4; int blankSuffix=0; setText(text,textColor,speed,blankSuffix);
timeOut()槽函數(shù):
//槽函數(shù) void Widget::timeOut(){ qDebug()<<m_moveOffset<<m_moveSize; m_moveOffset+=m_pixelSize; if(m_moveOffset>m_moveSize) { m_moveOffset= 0; } update(); }
調(diào)整窗口大小resizeEvent事件:
void Widget::resizeEvent(QResizeEvent *event) { font.setPixelSize(event->size().height()*0.75);//字體大小(這里設(shè)置為窗口高度的0.75倍) m_showText = m_text; QFontMetrics metrics(font); int char_w = metrics.horizontalAdvance(" ");//Qt5.11之后,之前請(qǐng)用width() setDelay(30,char_w*speed);//滾動(dòng)延時(shí) int blankLine =width()/char_w+1; for(int i=0;i<blankLine;i++) { m_showText.insert(0," ");//開頭插入blankLine個(gè)空格 } m_moveSize=metrics.horizontalAdvance(m_showText)+blankSuffix; m_moveOffset=0; update(); }
重寫繪制事件paintEvent:
//繪圖事件 void Widget::paintEvent(QPaintEvent *event) { QPainter painter(this); painter.setFont(font);//設(shè)置字體 painter.setPen(QColor(120,120,120));//設(shè)置畫筆顏色——灰色 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);//繪制文字,水平居左垂直居中 }
定義滾動(dòng)延遲函數(shù):
//設(shè)置滾動(dòng)延遲,多少ms滾動(dòng)多少像素點(diǎn)pixelSize void Widget::setDelay(int ms,int pixelSize) { this->m_ms=ms; this->m_pixelSize=pixelSize; }
設(shè)置字體相關(guān)信息:
//設(shè)置字體相關(guān)信息(text:字體內(nèi)容,textColor:顏色,speed:字體滾動(dòng)速度,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; //文本內(nèi)容 m_showText = m_text; //顯示內(nèi)容 //計(jì)算字符大小 QFontMetrics metrics(font); int char_w = metrics.horizontalAdvance(" ");//Qt5.11之后,之前請(qǐng)用width() setDelay(50,char_w*speed);//調(diào)用setDelay()函數(shù),設(shè)置滾動(dòng)延時(shí) int blankLine =width()/char_w+2;// for(int i=0;i<blankLine;i++) { m_showText.insert(0," ");//開頭插入blankLine個(gè)空格 } m_moveSize=metrics.horizontalAdvance(m_showText)+blankSuffix; m_moveOffset=0; //如果計(jì)時(shí)器沒有運(yùn)行 if(!timer->isActive()) { if(m_ms) { timer->start(m_ms);//啟動(dòng)計(jì)時(shí),以m_ms為間隔 } } }
五、效果演示
完整效果如下:
以上就是Qt實(shí)現(xiàn)字幕滾動(dòng)效果的示例代碼的詳細(xì)內(nèi)容,更多關(guān)于Qt字幕滾動(dòng)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
基于atoi()與itoa()函數(shù)的內(nèi)部實(shí)現(xiàn)方法詳解
本篇文章是對(duì)atoi()與itoa()函數(shù)的內(nèi)部實(shí)現(xiàn)方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05C++11之std::future對(duì)象的使用以及說明
這篇文章主要介紹了C++11之std::future對(duì)象的使用以及說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02C/C++?Qt?TreeWidget?單層樹形組件應(yīng)用小結(jié)
TreeWidget?目錄樹組件,該組件適用于創(chuàng)建和管理目錄樹結(jié)構(gòu),在開發(fā)中我們經(jīng)常會(huì)把它當(dāng)作一個(gè)升級(jí)版的ListView組件使用,本文將通過TreeWidget實(shí)現(xiàn)多字段顯示,并增加一個(gè)自定義菜單,通過在指定記錄上右鍵可彈出該菜單并對(duì)指定記錄進(jìn)行操作2021-11-11