欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Qt實(shí)現(xiàn)字幕滾動(dòng)效果的示例代碼

 更新時(shí)間:2022年06月17日 09:42:08   作者:wendy_ya  
這篇文章主要介紹了Qt如何利用QTimer實(shí)現(xiàn)字幕滾動(dòng)功能,并且可以實(shí)現(xiàn)自行更改文本內(nèi)容、自適應(yīng)文本大小、自由調(diào)整速度等功能,感興趣的可以學(xué)習(xí)一下

一、項(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)文章

  • C語(yǔ)言實(shí)現(xiàn)遍歷文件夾中的文件

    C語(yǔ)言實(shí)現(xiàn)遍歷文件夾中的文件

    這篇文章主要為大家詳細(xì)介紹了如何使用C語(yǔ)言實(shí)現(xiàn)遍歷文件夾中的文件,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,有需要的小伙伴可以參考一下
    2024-02-02
  • 基于atoi()與itoa()函數(shù)的內(nèi)部實(shí)現(xiàn)方法詳解

    基于atoi()與itoa()函數(shù)的內(nèi)部實(shí)現(xiàn)方法詳解

    本篇文章是對(duì)atoi()與itoa()函數(shù)的內(nèi)部實(shí)現(xiàn)方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C語(yǔ)言實(shí)現(xiàn)漢諾塔游戲

    C語(yǔ)言實(shí)現(xiàn)漢諾塔游戲

    個(gè)人覺得漢諾塔這個(gè)遞歸算法比電子老鼠的難了一些,不過一旦理解了也還是可以的,其實(shí)網(wǎng)上也有很多代碼,可以直接參考。記得大一開始時(shí)就做過漢諾塔的習(xí)題,但是那時(shí)代碼寫得很長(zhǎng)很長(zhǎng),也是不理解遞歸的結(jié)果。今天重新來實(shí)現(xiàn)一下
    2015-03-03
  • C語(yǔ)言18個(gè)必背經(jīng)典程序

    C語(yǔ)言18個(gè)必背經(jīng)典程序

    這篇文章主要分下工的是18個(gè)C語(yǔ)言必背的經(jīng)典程序,下面文章我們就來看看實(shí)例,需要的小伙伴可以參考一下喲,希望對(duì)你有所幫助
    2021-10-10
  • C++11之std::future對(duì)象的使用以及說明

    C++11之std::future對(duì)象的使用以及說明

    這篇文章主要介紹了C++11之std::future對(duì)象的使用以及說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • C++中平衡二叉搜索樹的模擬實(shí)現(xiàn)

    C++中平衡二叉搜索樹的模擬實(shí)現(xiàn)

    二叉搜索樹雖可以縮短查找的效率,但如果數(shù)據(jù)有序或接近有序二叉搜索樹將退化為單支樹,查找元素相當(dāng)于在順序表中搜索元素,效率低下,所以本文給大家介紹了C++平衡二叉的搜索樹模擬實(shí)現(xiàn)方法,需要的朋友可以參考下
    2023-09-09
  • C/C++?Qt?TreeWidget?單層樹形組件應(yīng)用小結(jié)

    C/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
  • C++中進(jìn)行txt文件讀入和寫入的方法示例

    C++中進(jìn)行txt文件讀入和寫入的方法示例

    這篇文章主要給大家介紹了C++中進(jìn)行txt文件讀入和寫入的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用C++具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • 詳解C語(yǔ)言處理算經(jīng)中著名問題百錢百雞

    詳解C語(yǔ)言處理算經(jīng)中著名問題百錢百雞

    古代的很多數(shù)學(xué)問題都可以用現(xiàn)代的編程語(yǔ)言去嘗試解決,就如本篇,將會(huì)帶你通過C語(yǔ)言來解決算經(jīng)中百錢百雞問題,感興趣的朋友來看看吧
    2022-02-02
  • C語(yǔ)言銀行儲(chǔ)蓄系統(tǒng)源碼

    C語(yǔ)言銀行儲(chǔ)蓄系統(tǒng)源碼

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言銀行儲(chǔ)蓄系統(tǒng)源碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01

最新評(píng)論