赛博键盘侠 2023-10-23 00:10 采纳率: 50%
浏览 19

Qt的QVideoWidget全屏设置异常

Qt的QVideoWidget全屏设置异常

系统:windows11,Qt:6.2.4

首先通过重写双击鼠标事件如下:

void MainPanel::mouseDoubleClickEvent(QMouseEvent *event)
{
    //m_videoWidget为QVideoWidget的new对象
    qDebug()<<"m_videoWidget.isFullScreen():"<<m_videoWidget->isFullScreen();//测试打印
    m_videoWidget->setFullScreen(!m_videoWidget->isFullScreen());
}

运行后第一次双击时能实现全屏,并且能打印isFullScreen();的值,但是全屏状态下再次双击就不进入mouseDoubleClickEvent,界面也没有反应,而且无任何打印输出。甚至我写了esc取消全屏的事件也没用。。

然后我修改了代码,加了个定时器

    timer->setSingleShot(true);
    m_videoWidget->setFullScreen(m_videoWidget->isFullScreen());
    connect(timer,&QTimer::timeout,this,[=](){
        qDebug()<<"m_videoWidget.isFullScreen():"<<m_videoWidget->isFullScreen();//测试打印
        m_videoWidget->setFullScreen(false);
    });
     timer->start(3000);

发现这样在第一次双击全屏后过3秒能正常打印isFullScreen()也能正常取消全屏。

这是什么情况

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-10-23 02:31
    关注

    【以下回答由 GPT 生成】

    这个问题是由于全屏状态下第二次双击时,并不会触发mouseDoubleClickEvent事件所导致的。这是因为全屏时,鼠标事件被QVideoWidget所捕获,而不再传递给父类的MainPanel

    为了解决这个问题,可以考虑使用eventFilter函数来监控鼠标事件,并手动处理全屏状态下的双击事件。

    以下是一种可能的解决方案:

    1. MainPanel的构造函数中,调用m_videoWidget->installEventFilter(this)来安装事件过滤器。
    2. MainPanel中重写eventFilter函数。
    bool MainPanel::eventFilter(QObject *obj, QEvent *event)
    {
        if (obj == m_videoWidget && event->type() == QEvent::MouseButtonDblClick) {
            QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(event);
            if (mouseEvent->button() == Qt::LeftButton) {
                if (m_videoWidget->isFullScreen()) {
                    // 取消全屏
                    m_videoWidget->setFullScreen(false);
                } else {
                    // 进入全屏
                    m_videoWidget->setFullScreen(true);
                }
                return true; // 已处理事件,不再传递给对象
            }
        }
        return QObject::eventFilter(obj, event);
    }
    

    这样,在全屏状态下第二次双击时,就能正常触发全屏、取消全屏操作了。

    请注意在MainPanel的头文件中声明eventFilter函数:

    protected:
        bool eventFilter(QObject *obj, QEvent *event) override;
    

    这样的改动可以避免Qt的事件系统问题导致的全屏设置异常。


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 创建了问题 10月23日

悬赏问题

  • ¥15 x264库中预测模式字IPM、运动向量差MVD、量化后的DCT系数的位置
  • ¥15 curl 命令调用正常,程序调用报 java.net.ConnectException: connection refused
  • ¥20 关于web前端如何播放二次加密m3u8视频的问题
  • ¥15 使用百度地图api 位置函数报错?
  • ¥15 metamask如何添加TRON自定义网络
  • ¥66 关于川崎机器人调速问题
  • ¥15 winFrom界面无法打开
  • ¥30 crossover21 ARM64版本安装软件问题
  • ¥15 mymetaobjecthandler没有进入
  • ¥15 mmo能不能做客户端怪物