<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          libVLC 捕捉鼠標(biāo)事件(全屏/還原)

          共 2645字,需瀏覽 6分鐘

           ·

          2020-08-18 09:27

          當(dāng)用 libVLC 播放視頻文件時(shí),你是否嘗試過捕獲鍵盤、鼠標(biāo)單擊/雙擊事件呢?例如,在用戶雙擊視頻屏幕時(shí)最大化顯示窗口!


          之所以有此一問,是因?yàn)?span style="color: rgb(233, 105, 0);font-family: monospace;letter-spacing: 0.544px;background-color: rgb(248, 248, 248);">在默認(rèn)情況下我們根本無法捕獲這些事件,libVLC “吃”了它們,那么如何解決這個(gè)問題呢?


          關(guān)于這個(gè)話題,網(wǎng)上有很多答案 - 鉤子、修改源碼 ...... 各種“技巧”應(yīng)有盡有。其實(shí)完全不需要這么復(fù)雜,只需要調(diào)用 libVLC 中兩個(gè)簡(jiǎn)單的接口就好啦,以最常見的全屏/還原為例介紹一下!



          1

          實(shí)現(xiàn)全屏/還原


          在《將 libVLC 視頻渲染到 QWidget 中》一節(jié)中曾介紹過,libVLC 在播放時(shí)需要傳遞一個(gè)窗口句柄,最終視頻將會(huì)被呈現(xiàn)到該窗口上。


          為了能夠?qū)崿F(xiàn)全屏/還原的切換,我們單獨(dú)封裝這樣一個(gè)媒體窗口,專門用于后期視頻的控制:


          #include?

          class?MediaWindow?:?public?QWidget
          {
          ????Q_OBJECT

          public:
          ????explicit?MediaWindow(QWidget?*parent?=?Q_NULLPTR);
          ????~MediaWindow();

          protected:
          ????//?鍵盤事件
          ????void?keyPressEvent(QKeyEvent?*event)?Q_DECL_OVERRIDE;
          ????//?鼠標(biāo)雙擊事件
          ????void?mouseDoubleClickEvent(QMouseEvent?*event)?Q_DECL_OVERRIDE;

          public?Q_SLOTS:
          ????//?全屏顯示
          ????void?setFullScreen();
          ????//?退出全屏
          ????void?exitFullScreen();
          };


          它提供了兩個(gè)槽函數(shù) - setFullScreen() 和 exitFullScreen(),前者用于實(shí)現(xiàn)全屏功能,而后者則用于退出全屏(即:還原):


          void?MediaWindow::setFullScreen()
          {
          ????//?將其作為窗口
          ????setWindowFlags(windowFlags()?|?Qt::Window);

          ????//?全屏顯示
          ????showFullScreen();
          }

          void?MediaWindow::exitFullScreen()
          {
          ????//?嵌入
          ????setWindowFlags(windowFlags()?&?~Qt::WindowFlags(Qt::Window));

          ????//?結(jié)束全屏
          ????showNormal();
          }


          然后在鼠標(biāo)雙擊事件中,根據(jù)當(dāng)前窗口的顯示模式(是否全屏)來調(diào)用不同的接口,以完成全屏/還原的切換:


          void?MediaWindow::mouseDoubleClickEvent(QMouseEvent?*event)
          {
          ????event->ignore();

          ????//?鼠標(biāo)左鍵雙擊,切換全屏/退出全屏
          ????if?(event->button()?&?Qt::LeftButton)?{
          ????????if?(isFullScreen())?{
          ????????????exitFullScreen();
          ????????}?else?{
          ????????????setFullScreen();
          ????????}
          ????}
          }


          為了方便操作,我們還重寫了鍵盤事件,當(dāng)按下“Esc”鍵時(shí),便可以退出全屏模式了:


          void?MediaWindow::keyPressEvent(QKeyEvent?*event)
          {
          ????event->ignore();

          ????switch?(event->key())?{
          ????case?Qt::Key_Escape:?{
          ????????if?(isFullScreen())
          ????????????exitFullScreen();
          ????}
          ????????break;
          ????default:
          ????????break;
          ????}
          }



          2

          捕獲鼠標(biāo)事件


          要捕捉鼠標(biāo)事件,只需在創(chuàng)建完媒體播放器后,調(diào)用 libvlc_video_set_mouse_input() 和 libvlc_video_set_key_input() 即可,這樣 libVLC 就可以忽略鍵盤和鼠標(biāo)事件了:


          Player::Player(QObject?*parent)
          ????:?QObject(parent)
          {
          ????m_instance?=?libvlc_new(0,?nullptr);
          ????m_player?=?libvlc_media_player_new(m_instance);

          ????//?忽略事件處理
          ????libvlc_video_set_mouse_input(m_player,?false);
          ????libvlc_video_set_key_input(m_player,?false);
          }


          注意:這兩個(gè)接口的第二個(gè)參數(shù)都要是 false 才行。


          完成之后,就可以實(shí)現(xiàn)我們的最終功能了:


          #include?
          #include?"player.h"
          #include?"mediawindow.h"

          int?main(int?argc,?char?*argv[])
          {
          ????const?QString?localMrl?=?"Sample.mkv";

          ????QApplication?app(argc,?argv);

          ????Player?player;
          ????MediaWindow?window;

          ????//?設(shè)置視頻輸出并播放
          ????player.setVideoWindow(&window);
          ????window.resize(600,?400);
          ????window.show();
          ????player.openMrl(localMrl,?true);

          ????return?app.exec();
          }



          3

          實(shí)現(xiàn)效果


          在視頻的播放過程中,隨時(shí)都可以通過鼠標(biāo)雙擊來實(shí)現(xiàn)全屏/還原的模式切換,最終效果如下:


          還原


          全屏


          ·END·
          ?

          作者:一去、二三里
          愛學(xué)習(xí),愛編程,愛生活。
          歡迎來撩,一起暢談程序人生!

          點(diǎn)個(gè)在看,么么噠!

          瀏覽 117
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  大香蕉色老板 | 久久麻豆av | 翔田千里无码XXXXXX | 16一17女人毛片 | 豆花视频在线观看观看 |