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