libVLC 捕捉鼠标事件(全屏/还原)

高效程序员

共 2645字,需浏览 6分钟

 ·

2020-08-18 09:27

当用 libVLC 播放视频文件时,你是否尝试过捕获键盘、鼠标单击/双击事件呢?例如,在用户双击视频屏幕时最大化显示窗口!


之所以有此一问,是因为在默认情况下我们根本无法捕获这些事件,libVLC “吃”了它们,那么如何解决这个问题呢?


关于这个话题,网上有很多答案 - 钩子、修改源码 ...... 各种“技巧”应有尽有。其实完全不需要这么复杂,只需要调用 libVLC 中两个简单的接口就好啦,以最常见的全屏/还原为例介绍一下!



1

实现全屏/还原


在《将 libVLC 视频渲染到 QWidget 中》一节中曾介绍过,libVLC 在播放时需要传递一个窗口句柄,最终视频将会被呈现到该窗口上。


为了能够实现全屏/还原的切换,我们单独封装这样一个媒体窗口,专门用于后期视频的控制:


#include 

class MediaWindow : public QWidget
{
    Q_OBJECT

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

protected:
    // 键盘事件
    void keyPressEvent(QKeyEvent *event) Q_DECL_OVERRIDE;
    // 鼠标双击事件
    void mouseDoubleClickEvent(QMouseEvent *event) Q_DECL_OVERRIDE;

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


它提供了两个槽函数 - setFullScreen() 和 exitFullScreen(),前者用于实现全屏功能,而后者则用于退出全屏(即:还原):


void MediaWindow::setFullScreen()
{
    // 将其作为窗口
    setWindowFlags(windowFlags() | Qt::Window);

    // 全屏显示
    showFullScreen();
}

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

    // 结束全屏
    showNormal();
}


然后在鼠标双击事件中,根据当前窗口的显示模式(是否全屏)来调用不同的接口,以完成全屏/还原的切换:


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

    // 鼠标左键双击,切换全屏/退出全屏
    if (event->button() & Qt::LeftButton) {
        if (isFullScreen()) {
            exitFullScreen();
        } else {
            setFullScreen();
        }
    }
}


为了方便操作,我们还重写了键盘事件,当按下“Esc”键时,便可以退出全屏模式了:


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

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



2

捕获鼠标事件


要捕捉鼠标事件,只需在创建完媒体播放器后,调用 libvlc_video_set_mouse_input() 和 libvlc_video_set_key_input() 即可,这样 libVLC 就可以忽略键盘和鼠标事件了:


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

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


注意:这两个接口的第二个参数都要是 false 才行。


完成之后,就可以实现我们的最终功能了:


#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;

    // 设置视频输出并播放
    player.setVideoWindow(&window);
    window.resize(600400);
    window.show();
    player.openMrl(localMrl, true);

    return app.exec();
}



3

实现效果


在视频的播放过程中,随时都可以通过鼠标双击来实现全屏/还原的模式切换,最终效果如下:


还原


全屏


·END·
 

作者:一去、二三里
爱学习,爱编程,爱生活。
欢迎来撩,一起畅谈程序人生!

点个在看,么么哒!

浏览 92
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报