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

问题描述

按钮设置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的键盘输入事件就行了。

你可能感兴趣的:(冲突问题,qt)