最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用Qt開發(fā)實(shí)現(xiàn)字幕滾動(dòng)效果

 更新時(shí)間:2023年11月30日 08:54:11   作者:Qt程序員  
我們經(jīng)常能夠在外面看到那種滾動(dòng)字幕,那么就拿qt來做一個(gè)吧,文章通過代碼示例給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有有一定的參考價(jià)值,需要的朋友可以參考下

1、效果展示

我們經(jīng)常能夠在外面看到那種滾動(dòng)字幕,那么就拿qt來做一個(gè)吧。

2、實(shí)現(xiàn)思路

實(shí)現(xiàn)一個(gè)窗口部件,這個(gè)窗口部件顯示了一串文本標(biāo)語,它會(huì)每t毫秒向左移動(dòng)一個(gè)像素。如果窗口部件比文本寬,那么文本將會(huì)被多次重復(fù),直到能夠填滿整個(gè)窗口部件的寬度為止。

3、滾動(dòng)窗口部件

創(chuàng)建一個(gè)滾動(dòng)窗口類,將其命名為ticker。

3.1、成員變量

我們需要提供幾個(gè)成員變量。

  • myText用來表示要顯示的文本內(nèi)容。
  • offset表示當(dāng)前偏移量。
  • myTimerId表示定時(shí)器的ID編號(hào)。
    QString myText;
    int offset;
    int myTimerId;

3.2、事件重寫

需要重新實(shí)現(xiàn)了Ticker中的4個(gè)事件處理器,分別為paintEvent()、timerEvent()、showEvent()和 hideEvent();關(guān)于每個(gè)事件的職責(zé)后面再說。

    virtual void paintEvent(QPaintEvent* event) override; // 繪制事件
    virtual void timerEvent(QTimerEvent* event) override; // 定時(shí)器事件
    virtual void showEvent(QShowEvent* event) override; // 顯示事件
    virtual void hideEvent(QHideEvent* event) override; // 隱藏事件

3.3、成員方法

還需要提供幾個(gè)成員方法。關(guān)于每個(gè)方法的職責(zé)后面再說。

    void setText(const QString& newText);
    QString text() const { return myText; }
    QSize sizeHint() const;

3.4、方法實(shí)現(xiàn)

1.構(gòu)造函數(shù)

構(gòu)造函數(shù)把 offset變量初始化為0。用來繪制文本的x坐標(biāo)值就取自于這個(gè)offset 值。

定時(shí)器的ID通常是非零的,所以可以使用0來表示定時(shí)器還沒有啟動(dòng)。

Ticker::Ticker(QWidget *parent)
    : QWidget{parent}
{
    offset = 0;
    myTimerId = 0;
}

2.setText函數(shù)

setText()函數(shù)用來設(shè)置要顯示的文本。它調(diào)用update()強(qiáng)制執(zhí)行一個(gè)重繪操作,并且調(diào)用updateGeometry()通知對(duì)Ticker窗口部件負(fù)責(zé)的布局管理器,提示該窗口部件的大小發(fā)生了變化。

void Ticker::setText(const QString &newText)
{
    myText = newText;
    update();
    updateGeometry();
}

3.sizeHint函數(shù)

sizeHint()函數(shù)返回文本所需的空間大小,并以此作為窗口部件的理想尺寸。QWidget::fontMetrics()函數(shù)返回一個(gè)QFontMetrics對(duì)象;可以用這個(gè)對(duì)象查詢并獲得與這個(gè)窗口部件字體相關(guān)的信息。

QSize Ticker::sizeHint() const
{
    return fontMetrics().size(0, text());
}

4.paintEvent事件

paintEvent()函數(shù)使用QPainter::drawText()繪制文本。它使用fontMetrics()確定文本在水平方向上所需要的空間,并且在考慮offset值的同時(shí),多次繪制文本,直到能夠填充整個(gè)窗口部件的寬度為止。

void Ticker::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    int textWidth = fontMetrics().width(text());
    if(textWidth < 1)
    {
        return;
    }
    int x = -offset;
    while(x < width())
    {
        painter.drawText(x, 0, textWidth, height(), Qt::AlignLeft | Qt::AlignVCenter, text());
        x += textWidth;
    }
}

5.timerEvent定時(shí)器事件

系統(tǒng)每隔一定時(shí)間,都會(huì)調(diào)用一次timerEvent()函數(shù)。

通過在offset上加1來模擬移動(dòng),從而形成文本寬度的連續(xù)滾動(dòng)。然后,它使用QWidget::scroll()把窗口部件的內(nèi)容向左滾動(dòng)一個(gè)像素。

如果這個(gè)定時(shí)器事件不是我們所關(guān)注的那個(gè)定時(shí)器,就可以把它傳遞給基類。

這里也可以調(diào)用update()代替scrol(),但使用scroll()會(huì)更有效率,因?yàn)樗皇呛?jiǎn)單地移動(dòng)屏幕上已經(jīng)存在的像素并且只對(duì)這個(gè)窗口部件的新顯示區(qū)域(此時(shí),只是一個(gè)1像素乘以寬度的像素條)產(chǎn)生一個(gè)繪制事件。

void Ticker::timerEvent(QTimerEvent *event)
{
    if(event->timerId() == myTimerId)
    {
        ++offset;
        if(offset >= fontMetrics().width(text()))
        {
            offset = 0;
        }
        scroll(-1, 0);
    }
    else
    {
        QWidget::timerEvent(event);
    }
}

6.showEvent顯示事件

showEvent()函數(shù)用來啟動(dòng)個(gè)定時(shí)器。QObject::startTimer()調(diào)用會(huì)返回一個(gè)ID數(shù)字,用這個(gè)數(shù)字識(shí)別該定時(shí)器。QObject支持多個(gè)獨(dú)立的定時(shí)器,每一個(gè)都可以有自己的時(shí)間間隔。

在startTimer()調(diào)用之后,大約每30毫秒Qt都會(huì)產(chǎn)生一個(gè)定時(shí)器事件。至于具體的時(shí)間精度,則取決于所在的操作系統(tǒng)。

我們也可以在Ticker的構(gòu)造函數(shù)中完成startTimer()的調(diào)用,但是只有在窗口部件實(shí)際可見的時(shí)候,才有必要保存由Qt產(chǎn)生的定時(shí)器事件的那些資源。讓資源合理利用。

void Ticker::showEvent(QShowEvent *event)
{
    Q_UNUSED(event);
    myTimerId = startTimer(30);
}

7.hideEvent隱藏事件

hideEvent()函數(shù)調(diào)用QObject::killTimer()來停止該定時(shí)器。

void Ticker::hideEvent(QHideEvent *event)
{
    killTimer(myTimerId);
    myTimerId = 0;
}

定時(shí)器事件是一種低級(jí)事件,而且如果需要多個(gè)定時(shí)器時(shí),保持對(duì)所有定時(shí)器ID的跟蹤將會(huì)變得很麻煩。

在這種情況下,通常更為簡(jiǎn)單的方式是為每一個(gè)定時(shí)器分別創(chuàng)建一個(gè)QTimer對(duì)象。QTimer會(huì)在每個(gè)時(shí)間間隔發(fā)射timeout()信號(hào)。當(dāng)然QTimer也提供了一個(gè)非常方便的接口,可用于單觸發(fā)定時(shí)器(只觸發(fā)一次的定時(shí)器)QTimer::singleShot(t, this, &Ticker::onTimer)。

以上就是使用Qt開發(fā)實(shí)現(xiàn)字幕滾動(dòng)效果的詳細(xì)內(nèi)容,更多關(guān)于Qt字幕滾動(dòng)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • c++ STL set_difference set_intersection set_union 操作

    c++ STL set_difference set_intersection set_union 操作

    這篇文章主要介紹了c++ STL set_difference set_intersection set_union 操作,需要的朋友可以參考下
    2017-03-03
  • 基于C++ bitset常用函數(shù)及運(yùn)算符(詳解)

    基于C++ bitset常用函數(shù)及運(yùn)算符(詳解)

    下面小編就為大家?guī)硪黄贑++ bitset常用函數(shù)及運(yùn)算符(詳解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-11-11
  • C++運(yùn)算符重載詳情介紹

    C++運(yùn)算符重載詳情介紹

    這篇文章主要介紹了C++運(yùn)算符重載,C++當(dāng)中除了函數(shù)可以重載之外,其實(shí)運(yùn)算符也是可以重載的,C++根據(jù)操作數(shù)的數(shù)目和類型來決定要使用哪一種操作,下面一起進(jìn)入文章里哦阿姐更多詳情吧
    2022-01-01
  • 如何利用Matlab繪制出好看的火山圖

    如何利用Matlab繪制出好看的火山圖

    火山圖是散點(diǎn)圖的一種,它將統(tǒng)計(jì)測(cè)試中的統(tǒng)計(jì)顯著性量度和變化幅度相結(jié)合,從而能夠幫助快速直觀地識(shí)別那些變化幅度較大且具有統(tǒng)計(jì)學(xué)意義的數(shù)據(jù)點(diǎn)。本文將通過Matlab繪制好看的火山圖,需要的可以參考一下
    2022-03-03
  • C語言中#define在多行宏定義出錯(cuò)的原因及分析

    C語言中#define在多行宏定義出錯(cuò)的原因及分析

    這篇文章主要介紹了C語言中#define在多行宏定義出錯(cuò)的原因及分析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • C語言實(shí)現(xiàn)多項(xiàng)式的相加

    C語言實(shí)現(xiàn)多項(xiàng)式的相加

    這篇文章主要為大家介紹了C語言實(shí)現(xiàn)多項(xiàng)式的相加,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • 華為云CodeArts?IDE?Online快速入門和使用

    華為云CodeArts?IDE?Online快速入門和使用

    華為云CodeArts?IDE?Online服務(wù),提供了可隨時(shí)隨地編碼的云上開發(fā)環(huán)境,同時(shí)具備開放的生態(tài)和獨(dú)立插件市場(chǎng),本文主要介紹了華為云CodeArts?IDE?Online快速入門和使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-08-08
  • C語言非遞歸算法解決快速排序與歸并排序產(chǎn)生的棧溢出

    C語言非遞歸算法解決快速排序與歸并排序產(chǎn)生的棧溢出

    上期我們講完了排序算法下,不知道小伙伴們有沒有發(fā)現(xiàn)一個(gè)問題,快速排序和歸并排序我們都是用遞歸來實(shí)現(xiàn)的,可能有小伙伴會(huì)問,如果說數(shù)據(jù)量很多話,棧區(qū)空間會(huì)不會(huì)不夠用呢?這期我們就來解決使用遞歸實(shí)現(xiàn)的排序?qū)е聴R绯鋈绾谓鉀Q
    2022-04-04
  • 一篇文章帶你掌握C++虛函數(shù)的來龍去脈

    一篇文章帶你掌握C++虛函數(shù)的來龍去脈

    虛函數(shù)主要通過V-Table虛函數(shù)表來實(shí)現(xiàn),該表主要包含一個(gè)類的虛函數(shù)的地址表,可解決繼承、覆蓋的問題,下面這篇文章主要給大家介紹了如何通過一篇文章帶你掌握C++虛函數(shù)的來龍去脈,需要的朋友可以參考下
    2022-10-10
  • C++定時(shí)器Timer在項(xiàng)目中的使用方法

    C++定時(shí)器Timer在項(xiàng)目中的使用方法

    這篇文章主要給大家介紹了關(guān)于C++定時(shí)器Timer在項(xiàng)目中的基本使用方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用C++具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05

最新評(píng)論

中山市| 边坝县| 本溪| 措勤县| 汪清县| 手机| 馆陶县| 滦平县| 博爱县| 高要市| 高平市| 奉节县| 五峰| 三原县| 凯里市| 靖宇县| 宜兰市| 河东区| 富平县| 永兴县| 宾阳县| 吉木萨尔县| 磐石市| 新民市| 石台县| 岑溪市| 伊金霍洛旗| 蒲江县| 芒康县| 弥渡县| 温宿县| 咸丰县| 白河县| 玉溪市| 平昌县| 惠水县| 德令哈市| 明溪县| 阳曲县| 宕昌县| 香港|