您好,登錄后才能下訂單哦!
這篇文章主要介紹“Qt如何實現字幕滾動效果”,在日常操作中,相信很多人在Qt如何實現字幕滾動效果問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Qt如何實現字幕滾動效果”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
利用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為間隔 } } }
完整效果如下:
到此,關于“Qt如何實現字幕滾動效果”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。