libVLC 捕捉鼠标事件(全屏/还原)
共 2645字,需浏览 6分钟
·
2020-08-23 14:04
当用 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(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);
}
注意:这两个接口的第二个参数都要是 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(600, 400);
window.show();
player.openMrl(localMrl, true);
return app.exec();
}
3
实现效果
在视频的播放过程中,随时都可以通过鼠标双击来实现全屏/还原的模式切换,最终效果如下:
还原
全屏
·END·