Qt弹窗,点击非弹窗区域外,自动隐藏弹窗;

复制代码
 // 下面三个函数监听全局的隐藏事件, 为了保证客户端不可见的时候日历隐藏
    bool CPlaybackCalendarWidget::eventFilter(QObject *watched, QEvent *eve)
    {
        if (eve->type() == QEvent::ApplicationStateChange)//状态改变
         {
             if (qApp->applicationState() == Qt::ApplicationInactive || qApp->applicationState() == Qt::ApplicationHidden)//窗口未激活或者隐藏
             {
                 hide();
                 ptr_camera_ = nullptr;
             }
         }
        return QWidget::eventFilter(watched, eve);
    }

    void CPlaybackCalendarWidget::showEvent(QShowEvent *event)//应用程序范围的事件筛选器可能会对性能产生明显的影响,因此只有在必要时才应该安装它。所以show的时候安装,hide的时候去掉事件过滤;
    {
        qApp->installEventFilter(this);
        return QWidget::showEvent(event);
    }

    void CPlaybackCalendarWidget::hideEvent(QHideEvent *event)
    {
        qApp->removeEventFilter(this);
        ptr_camera_ = nullptr;
        return QWidget::hideEvent(event);
    }
}
复制代码

弹窗函数

复制代码
void PlayBackCtrlBar::OnPopupCalendar()
{
    QPoint ptPos = mapToGlobal(QPoint(0, 0));
    ptPos.setX(ptPos.x() + (width() - m_pCalendar->width()) / 2);
    ptPos.setY(ptPos.y() - m_pCalendar->height());
    
    m_pCalendar->move(ptPos);
    m_pCalendar->hide();//先隐藏再显示,否则会出现在主窗口下面;
    m_pCalendar->show();
    m_pCalendar->setFocus(Qt::FocusReason::ActiveWindowFocusReason);
    m_pCalendar->activateWindow();//一定要加这个激活窗口,点击其他地方会是弹窗状态由激活状态变为未激活,然后触发QEvent::ApplicationStateChange
//m_pCalendar->SetCurrentDateTime(ptr_progress_bar->GetCurrentDateTime()); }
复制代码

 

posted @   一字千金  阅读(164)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示