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

當(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·
?
點(diǎn)個(gè)在看,么么噠!

