Russian Qt Forum

Qt => Мультимедиа => Тема начата: torwig от Март 02, 2015, 12:41



Название: QVideoWidget и mouseTracking
Отправлено: torwig от Март 02, 2015, 12:41
Здравствуйте.
Необходимо получать события движения мыши поверх QVideoWidget. Вроде ничего сложного. Создал своего наследника, переопределил mouseMoveEvent(), написал в конструкторе setMouseTracking(true). Но, не работает)
Гугл из внятного показывает это https://bugreports.qt.io/browse/QTBUG-30728.
Пробовал отнаследоваться от обычного виджета и на нем разместить QVideoWidget, установив ему Qt::WA_TransparentForMouseEvents. Но и в этом случае все равно не пропускает событий без нажатий кнопки мыши.
Как можно выкрутиться с возникшей ситуации? Нечто вроде "накрыть QVideoWidget прозрачным виджетом, который будет ловить события мыши".
Спасибо.
п.с. Действие происходит на Убунте 14, Qt версии 5.2.


Название: Re: QVideoWidget и mouseTracking
Отправлено: Igors от Март 02, 2015, 13:38
Могу ошибаться, но стоит проверить банальный eventFilter который срабатывает и без mouseTracking


Название: Re: QVideoWidget и mouseTracking
Отправлено: torwig от Март 02, 2015, 16:42
Написал такой код:
Код:
bool VideoWidget::eventFilter(QObject* obj, QEvent* ev)
{
    if (ev->type() == QEvent::MouseMove && obj == mVideoWidget) {
        qDebug() << "filter";
        mouseMoveEvent(static_cast<QMouseEvent*>(ev));
        ev->accept();
        return true;
    }
    else {
        return QWidget::eventFilter(obj, ev);
    }
}
В конструкторе VideoWidget  делаю:
Код:
mVideoWidget->installEventFilter(this);

где VideoWidget - моя форма, на которой есть QVideoVidget(mVideoWidget). Сообщения "filter" появляются только при движении мыши с нажатой левой кнопкой мыши, если отпустить - никаких сообщений не наблюдается.


Название: Re: QVideoWidget и mouseTracking
Отправлено: Igors от Март 02, 2015, 17:01
Перекройте QApplication::notify, напр
Код
C++ (Qt)
bool MyApp::notify( QObject * receiver, QEvent * e )
{
 static int theNum = 0;
 switch (e->type()) {
   case QEvent::Timer:  // этого не печатать
    break;
   default:
    qDebug() << ++theNum << receiver << e->type();
 }
 return QApplication::notify(receiver, e);
}
 
И в консоли смотрите кто там такой умный получает 5 (MouseMove)


Название: Re: QVideoWidget и mouseTracking
Отправлено: Bepec от Март 02, 2015, 17:07
По идеологии Qt внутри скрывается виджет, который как раз и получает ваши передвижения. Другой вопрос, как до него добраться :)


Название: Re: QVideoWidget и mouseTracking
Отправлено: torwig от Март 02, 2015, 17:34
Igors, спасибо.
Сделал как Вы написали, оказалось что получает событие виджет (MainWidget), который я устанавливаю центральным для QMainWindow, и который задаю родителем для виджета с QVideoWidget.
Может ли такое быть из-за того, что "виджет с QVideoWidget" непосредственно не компонуется на MainWidget, а просто имеет его родителем (сделал так чтобы можно было мышкой перетягивать "виджет с QVideoWidget" внутри окна программы)?


Название: Re: QVideoWidget и mouseTracking
Отправлено: Igors от Март 02, 2015, 18:38
Может ли такое быть из-за того, что "виджет с QVideoWidget" непосредственно не компонуется на MainWidget, а просто имеет его родителем (сделал так чтобы можно было мышкой перетягивать "виджет с QVideoWidget" внутри окна программы)?
Нет, если мыша над верхним виджетом, то mouseMove он должен получать. Выкладывайте тестовый проект, посмотрим где собака порылась.


Название: Re: QVideoWidget и mouseTracking
Отправлено: torwig от Март 03, 2015, 10:54
Прикрепляю тестовый проект, урезал как мог :)
Использование: вызвать контекстное меню, выбрать видеофайл, подвигать мышкой над QVideoWidget - сообщения с mouseMoveEvent не приходят. Если попробовать переместить виджет с нажатой левой кнопкой мыши, сообщения есть.
п.с. вторая проблема проявится, если  попробовать нажать на кнопку "Открыть", возможно это связано с первой проблемой.
Спасибо. Буду рад любым замечаниям по коду.
п.с. Qt нужен 5.2 и выше, где есть уже multimediawidgets


Название: Re: QVideoWidget и mouseTracking
Отправлено: Igors от Март 03, 2015, 13:41
Qt 5.4 платформа OSX
Qt 5.3.2 платформа Вындоуз

В обоих случаях все работает "как доктор прописал" (и на notify приходит, и "mme" печать). Да, сначала приходит main окну (не виджету) - это нормально


Название: Re: QVideoWidget и mouseTracking
Отправлено: torwig от Март 03, 2015, 14:55
Igors, большое спасибо за тестирование.
На Виндовс у меня вывод
Код:
1470 QWidgetWindow(0xa37020, name = "QVideoWidgetClassWindow") 5 
1471 QVideoWidget(0xa2fc28) 5
1472 QWidgetWindow(0xa37020, name = "QVideoWidgetClassWindow") 5
1473 QVideoWidget(0xa2fc28) 5
1474 QWidgetWindow(0xa37020, name = "QVideoWidgetClassWindow") 5
1475 QVideoWidget(0xa2fc28) 5
1476 QWidgetWindow(0xa37020, name = "QVideoWidgetClassWindow") 5
1477 QVideoWidget(0xa2fc28) 5
1478 QWidgetWindow(0xa37020, name = "QVideoWidgetClassWindow") 5
1479 QVideoWidget(0xa2fc28) 5
1480 QWidgetWindow(0xa37020, name = "QVideoWidgetClassWindow") 5
1481 QVideoWidget(0xa2fc28) 5
1482 QWidgetWindow(0xa37020, name = "QVideoWidgetClassWindow") 5
а вот на Убунте такой:
Код:
9587 QWidgetWindow(0xe425e0, name = "MainWidgetClassWindow") 5
9588 MainWidget(0x9520b0) 5
9589 QXcbConnection(0x7676b0) 43
9590 QWidgetWindow(0xe425e0, name = "MainWidgetClassWindow") 5
9591 MainWidget(0x9520b0) 5
9592 QXcbConnection(0x7676b0) 43
9593 QWidgetWindow(0xe425e0, name = "MainWidgetClassWindow") 5
9594 MainWidget(0x9520b0) 5
9595 QXcbConnection(0x7676b0) 43
9596 QWidgetWindow(0xe425e0, name = "MainWidgetClassWindow") 5
9597 MainWidget(0x9520b0) 5
9598 QXcbConnection(0x7676b0) 43
9599 QWidgetWindow(0xe425e0, name = "MainWidgetClassWindow") 5
9600 MainWidget(0x9520b0) 5
9601 QXcbConnection(0x7676b0) 43
Проект запускал тот же, который прикреплял к теме.
"mme" не печатает совсем, разве что если мышкой водить с нажатой левой кнопкой.

Скажите, а при нажатии кнопки "Открыть" на форме у Вас форма не "уезжает" в левый верхний угол? На Убунте при этом появляется сообщение:
Код:
void QWindow::setTransientParent(QWindow*) QWidgetWindow(0xf7a7a0, name = "VideoFormWindow") must be a top level window.


Название: Re: QVideoWidget и mouseTracking
Отправлено: Igors от Март 03, 2015, 15:25
Скажите, а при нажатии кнопки "Открыть" на форме у Вас форма не "уезжает" в левый верхний угол? На Убунте при этом появляется сообщение:
Код:
void QWindow::setTransientParent(QWindow*) QWidgetWindow(0xf7a7a0, name = "VideoFormWindow") must be a top level window.
Нет, не наблюдал. Может Вам, не мудрствуя лукаво, обновить версию Qt? Если это сложно, то ловить или в notify или навесить фильтр на приложение (все что приходит в notify придет и туда, причем до того как будет послано виджету)