QVideoWidget全屏以后不触发键盘输入事件,无法退出全屏

博客介绍了在QVideoWidget全屏后,键盘输入事件无法触发的问题。作者发现全屏可能导致主窗口失焦,从而键盘事件不生效。解决方案是通过为QVideoWidget添加事件过滤器,监听并处理键盘输入,特别是Esc键,实现全屏退出。另一种方法是直接重写QVideoWidget的键盘事件处理。
摘要由CSDN通过智能技术生成
问题描述

按钮设置QVideoWidget全屏:

void MainWindow::on_full_screen_clicked()
{
    videoWidget->setWindowFlags (Qt::Window);
    videoWidget->showFullScreen();
}

想要写一个键盘输入事件,通过按下esc键来退出全屏,以下是原本键盘输入事件的代码:

//QVideoWidget全屏时键盘按键事件无效
void MainWindow::keyPressEvent(QKeyEvent *event)
{
    if(event->key()==Qt::Key_Escape)
   {
      videoWidget->setWindowFlags (Qt::SubWindow);
      videoWidget->showNormal();
      videoWidget->setGeometry(10,10,780,450);  //变回原来大小,具体尺寸根据原来的定
      qDebug()<<u8"退出全屏";
    }
}

但是,运行程序,发现按下esc并不能使它退出全屏。查看输出信息发现键盘输入事件并没有触发,反而是没有全屏的时候,能够触发键盘输入事件。

解决方法

通过在https://blog.csdn.net/leijia_xing/article/details/80422165

看到博主使用的事件过滤器,突然意识到,键盘输入事件是在主界面类中才能触发,又作用于主窗口界面类的。我将QVideoWidget全屏显示以后,很有可能导致主窗口界面失焦,从而键盘输入事件无法触发。所以我尝试给QVideoWidget添加键盘输入的事件过滤器,来识别esc的输入,将键盘输入事件对焦QVideoWidget。果然,成功了,下面放上我事件过滤器的代码,事件过滤器的声明和安装就不写了:

//esc退出全屏
bool MainWindow::eventFilter(QObject *target, QEvent *e)
{
    if (target==videoWidget)      
    {
      if(e->type() == QEvent::KeyPress)
      {
        QKeyEvent *keyEvent = static_cast<QKeyEvent *>(e);    //获取键盘输入事件对象
        if(keyEvent->key() == Qt::Key_Escape)
        {
            videoWidget->setWindowFlags(Qt::SubWindow);
            videoWidget->showNormal();
            videoWidget->setGeometry(10,10,780,450);         
            //变回原来大小,具体尺寸根据原来的定
          }
        }
}
    return QMainWindow::eventFilter(target, e);     
}

还有一种方法,由于全屏以后,作用的控件是QVideoWidget,所以只要重写QVideoWidget的键盘输入事件就行了。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值