@@ -48,11 +48,13 @@ CFrmPlayer::CFrmPlayer(QWidget *parent) : QWidget(parent)
4848 , m_pVideoItem(nullptr )
4949#endif
5050 , m_pToolBar(nullptr )
51+ , tm_ToolBar(this )
5152 , m_pbVideo(Qt::Horizontal, this )
5253 , m_pbVolume(Qt::Horizontal, this )
5354 , m_bMoveVideo(false )
5455 , m_pParameter(nullptr )
5556 , m_pLabel(nullptr )
57+ , m_bFullScreen(false )
5658{
5759 bool check = false ;
5860
@@ -67,11 +69,17 @@ CFrmPlayer::CFrmPlayer(QWidget *parent) : QWidget(parent)
6769 m_pVideoWidget = new QVideoWidget (this );
6870 m_pVideoWidget->setFocusPolicy (Qt::WheelFocus);
6971 m_pVideoWidget->installEventFilter (this );
72+ m_pVideoWidget->setMouseTracking (true );
73+ // ← 遍历内部子对象也装过滤器 + 开 tracking
74+ for (QObject *o : m_pVideoWidget->findChildren <QObject*>()) {
75+ o->installEventFilter (this );
76+ if (auto *w = qobject_cast<QWidget*>(o))
77+ w->setMouseTracking (true );
78+ }
7079 pLayout->addWidget (m_pVideoWidget);
7180#else
7281 // 创建场景和视频项
7382 QGraphicsScene *pScene = new QGraphicsScene (this );
74- pScene->installEventFilter (this );
7583 m_pVideoItem = new QGraphicsVideoItem;
7684 pScene->addItem (m_pVideoItem);
7785 // 创建视图并添加到布局
@@ -81,6 +89,9 @@ CFrmPlayer::CFrmPlayer(QWidget *parent) : QWidget(parent)
8189 m_pGraphicsView->setVerticalScrollBarPolicy (Qt::ScrollBarAlwaysOff);
8290 m_pGraphicsView->setFrameStyle (0 );
8391 m_pGraphicsView->setBackgroundBrush (Qt::black);
92+ m_pGraphicsView->setMouseTracking (true );
93+ m_pGraphicsView->viewport ()->setMouseTracking (true );
94+ m_pGraphicsView->viewport ()->installEventFilter (this );
8495 // 关视频尺寸变化时,重新 fitInView
8596 connect (m_pVideoItem, &QGraphicsVideoItem::nativeSizeChanged,
8697 this , [this ](const QSizeF &size) {
@@ -262,15 +273,44 @@ void CFrmPlayer::slotPositionChanged(qint64 pos, qint64 duration)
262273 }
263274}
264275
276+ // ! [Full Screen]
277+ int CFrmPlayer::OnFullScreen (bool bFull)
278+ {
279+ int nRet = 0 ;
280+ m_bFullScreen = bFull;
281+ if (bFull) {
282+ m_Margins = layout ()->contentsMargins ();
283+ layout ()->setContentsMargins (QMargins ());
284+ } else {
285+ layout ()->setContentsMargins (m_Margins);
286+ }
287+ if (m_pToolBar && m_bFullScreen)
288+ m_pToolBar->hide ();
289+ return nRet;
290+ }
291+ // ! [Full Screen]
292+
265293void CFrmPlayer::focusInEvent (QFocusEvent *event)
266294{
267295 qDebug (log) << Q_FUNC_INFO << event << this ;
296+ Q_UNUSED (event)
268297 emit sigViewerFocusIn (this );
269298}
270299
271300void CFrmPlayer::focusOutEvent (QFocusEvent *event)
272301{
273302 qDebug (log) << Q_FUNC_INFO << event << this ;
303+ Q_UNUSED (event)
304+ }
305+
306+ void CFrmPlayer::mouseMoveEvent (QMouseEvent *event)
307+ {
308+ // qDebug(log) << Q_FUNC_INFO;
309+ Q_UNUSED (event)
310+ if (m_pToolBar && m_pToolBar->isHidden ()) {
311+ m_pToolBar->show ();
312+ StartTimer ();
313+ }
274314}
275315
276316void CFrmPlayer::slotStart (bool bStart)
@@ -289,6 +329,7 @@ void CFrmPlayer::slotStart(bool bStart)
289329 m_paRecordPause->setEnabled (true );
290330 m_paRecordPause->setChecked (false );
291331#endif
332+ StartTimer ();
292333 } else {
293334 p->setIcon (QIcon::fromTheme (" media-playback-start" ));
294335 p->setText (tr (" Start" ));
@@ -301,19 +342,44 @@ void CFrmPlayer::slotStart(bool bStart)
301342 m_paRecordPause->setEnabled (false );
302343 m_paRecordPause->setChecked (false );
303344#endif
345+ tm_ToolBar.stop ();
346+ m_pToolBar->show ();
347+ }
348+ }
349+
350+ void CFrmPlayer::slotTimeOut ()
351+ {
352+ if (!m_pToolBar)
353+ return ;
354+ m_pToolBar->hide ();
355+ }
356+
357+ void CFrmPlayer::StartTimer ()
358+ {
359+ if (m_pParameter && m_pParameter->GetHideToolBar () <= 0
360+ || !m_bFullScreen)
361+ return ;
362+ if (m_paStart->isChecked ()) {
363+ tm_ToolBar.stop ();
364+ tm_ToolBar.singleShot (m_pParameter->GetHideToolBar () * 1000 ,
365+ this , SLOT (slotTimeOut ()));
304366 }
305367}
306368
307369bool CFrmPlayer::eventFilter (QObject *watched, QEvent *event)
308370{
309371// qDebug(log) << Q_FUNC_INFO << event;
310372#ifdef WITH_QVideoWidget
311- if (m_pVideoWidget == watched)
373+ if (m_pVideoWidget == watched
374+ || m_pVideoWidget->isAncestorOf (qobject_cast<QWidget*>(watched)))
312375 {
313376 switch (event->type ()){
314- case QEvent::MouseMove:
377+ case QEvent::MouseMove: {
315378 qDebug (log) << " Mouse move" ;
316- break ;
379+ QMouseEvent* e = (QMouseEvent*)event;
380+ mouseMoveEvent (e);
381+ return true ;
382+ }
317383 case QEvent::MouseButtonRelease:
318384 m_paPause->trigger ();
319385 break ;
@@ -351,6 +417,19 @@ bool CFrmPlayer::eventFilter(QObject *watched, QEvent *event)
351417 }
352418 return true ;
353419 }
420+ #else
421+ if (m_pGraphicsView->viewport () == watched) {
422+ switch (event->type ()){
423+ case QEvent::MouseMove: {
424+ qDebug (log) << " Mouse move" ;
425+ QMouseEvent* e = (QMouseEvent*)event;
426+ mouseMoveEvent (e);
427+ return true ;
428+ }
429+ default :
430+ break ;
431+ }
432+ }
354433#endif
355434 return false ; // 让 widget 自己继续处理
356435}
@@ -367,4 +446,4 @@ void CFrmPlayer::UpdateGraphicsVideoGeometry()
367446 m_pGraphicsView->setSceneRect (m_pVideoItem->boundingRect ());
368447 m_pGraphicsView->fitInView (m_pVideoItem, Qt::KeepAspectRatio);
369448}
370- #endif
449+ #endif
0 commit comments