Russian Qt Forum
Ноябрь 22, 2024, 12:28 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QVideoWidget и mouseTracking  (Прочитано 7288 раз)
torwig
Самовар
**
Offline Offline

Сообщений: 134



Просмотр профиля
« : Март 02, 2015, 12:41 »

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

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Март 02, 2015, 13:38 »

Могу ошибаться, но стоит проверить банальный eventFilter который срабатывает и без mouseTracking
Записан
torwig
Самовар
**
Offline Offline

Сообщений: 134



Просмотр профиля
« Ответ #2 : Март 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" появляются только при движении мыши с нажатой левой кнопкой мыши, если отпустить - никаких сообщений не наблюдается.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Март 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)
Записан
Bepec
Гость
« Ответ #4 : Март 02, 2015, 17:07 »

По идеологии Qt внутри скрывается виджет, который как раз и получает ваши передвижения. Другой вопрос, как до него добраться Улыбающийся
Записан
torwig
Самовар
**
Offline Offline

Сообщений: 134



Просмотр профиля
« Ответ #5 : Март 02, 2015, 17:34 »

Igors, спасибо.
Сделал как Вы написали, оказалось что получает событие виджет (MainWidget), который я устанавливаю центральным для QMainWindow, и который задаю родителем для виджета с QVideoWidget.
Может ли такое быть из-за того, что "виджет с QVideoWidget" непосредственно не компонуется на MainWidget, а просто имеет его родителем (сделал так чтобы можно было мышкой перетягивать "виджет с QVideoWidget" внутри окна программы)?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Март 02, 2015, 18:38 »

Может ли такое быть из-за того, что "виджет с QVideoWidget" непосредственно не компонуется на MainWidget, а просто имеет его родителем (сделал так чтобы можно было мышкой перетягивать "виджет с QVideoWidget" внутри окна программы)?
Нет, если мыша над верхним виджетом, то mouseMove он должен получать. Выкладывайте тестовый проект, посмотрим где собака порылась.
Записан
torwig
Самовар
**
Offline Offline

Сообщений: 134



Просмотр профиля
« Ответ #7 : Март 03, 2015, 10:54 »

Прикрепляю тестовый проект, урезал как мог Улыбающийся
Использование: вызвать контекстное меню, выбрать видеофайл, подвигать мышкой над QVideoWidget - сообщения с mouseMoveEvent не приходят. Если попробовать переместить виджет с нажатой левой кнопкой мыши, сообщения есть.
п.с. вторая проблема проявится, если  попробовать нажать на кнопку "Открыть", возможно это связано с первой проблемой.
Спасибо. Буду рад любым замечаниям по коду.
п.с. Qt нужен 5.2 и выше, где есть уже multimediawidgets
« Последнее редактирование: Март 03, 2015, 11:44 от torwig » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Март 03, 2015, 13:41 »

Qt 5.4 платформа OSX
Qt 5.3.2 платформа Вындоуз

В обоих случаях все работает "как доктор прописал" (и на notify приходит, и "mme" печать). Да, сначала приходит main окну (не виджету) - это нормально
« Последнее редактирование: Март 03, 2015, 13:43 от Igors » Записан
torwig
Самовар
**
Offline Offline

Сообщений: 134



Просмотр профиля
« Ответ #9 : Март 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.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #10 : Март 03, 2015, 15:25 »

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


Страница сгенерирована за 0.244 секунд. Запросов: 23.