![]() |
|
![]() ![]() ![]() |
|
kuvshinka |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 386 Регистрация: 27.4.2008 Репутация: нет Всего: нет |
На главной форме приложения при определенной X-координате мыши появляется всплывающее меню QMenu, после чего при движении мыши не срабатывает метод mouseMoveEvent(QMouseEvent *event) главной формы, наверное из-за передачи фокуса в появившееся меню...как мне сделать так, чтобы при движении мыши по главной форме ВСЕГДА срабатывал бы ее метод mouseMoveEvent?
Делаю так
|
|||
|
||||
vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 3 Всего: 56 |
поставь фильтр(installEventFilter) на сообщения QMenu, и верни для MouseMove false.
|
|||
|
||||
kuvshinka |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 386 Регистрация: 27.4.2008 Репутация: нет Всего: нет |
vinter: а можно примерчик, а то я что-то не поняла что к чему надо сделать...
|
|||
|
||||
vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 3 Всего: 56 |
посмотри документацию к installEventFilter, там есть пример
|
|||
|
||||
kuvshinka |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 386 Регистрация: 27.4.2008 Репутация: нет Всего: нет |
Пробую так
вообще не вызывается eventFilter при отображении myMenu и что значит «верни для MouseMove false»? Подскажите пож-та что неверно в моем примере и как это исправить... |
|||
|
||||
vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 3 Всего: 56 |
Попробуй так:
|
|||
|
||||
kuvshinka |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 386 Регистрация: 27.4.2008 Репутация: нет Всего: нет |
vinter, К указанному Вами выше примеру добавляю
в итоге после появления всплывающего меню ПРОГРАММА и КОМПЬЮТЕР ЗАВИСАЮТ... |
|||
|
||||
vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 3 Всего: 56 |
kuvshinka, я тебе показал, как пропустить события MoseMove из меню в изначальную форму. Как справляться с остальным? Думай сама, для меня эта ситуация выглядит глупой т.к. меню, не должно отдавать мышь форме. Видимо у тебя какая-то логика с этим связана, а значит решай как тебе поступать.
"Висит" у тебя, скорее всего из-за перекрестных событий, которые попадают в цикл зависимости друг от друга. В качестве варианта, можно попробовать выставлять флаг, когда меню показано и не выполнять if (event->pos().x()>=100) в этом случае. В общем надо смотреть с дебагером и разбираться. Добавлено через 55 секунд P.S. Компьютер не должен зависать из-за одной программы. |
|||
|
||||
ALEXRAGE |
|
|||
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 17.1.2014 Где: Санкт-Петербург Репутация: нет Всего: нет |
Думаю просто нужно передать QMouseEvent *event дальше на обработку.
Что-то типа QMenu::mouseMoveEvent(event); |
|||
|
||||
kuvshinka |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 386 Регистрация: 27.4.2008 Репутация: нет Всего: нет |
vinter:
Да нет там никакой особой логики – в новый проект вставила ваш пример + мой обработчик mouseMoveEvent (см. Test.rar) и получается такое зависание (а компьютер зависает, если программу запустить под убунтой, под виндой программа тоже виснет, но ее можно хотя бы остановить). Присоединённый файл ( Кол-во скачиваний: 2 ) ![]() |
|||
|
||||
vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 3 Всего: 56 |
kuvshinka, логика у тебя уже есть. Ты пытаешься прокидывать сообщения из контекстного меню на форму. Но в обработчике этих сообщений ты манипулируешь меню. Не видишь рекурсии? Ты должна разобраться с этим, это твоя логика. Она должна исключить рекурсию.
С помощью отладчика тоже можно довольно быстро отыскать проблему. |
|||
|
||||
kuvshinka |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 386 Регистрация: 27.4.2008 Репутация: нет Всего: нет |
да даже если я перенесу код отображения диалога, допустим, в онклик кнопки и соответственно оставлю Mainclass::mouseMoveEvent пустым и даже если и Mainclass::eventFilter(QObject *obj, QEvent *ev) сделаю пустым, то все равно меню будет появляться без его пунктов и программа подвиснет...
|
|||
|
||||
ALEXRAGE |
|
|||
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 17.1.2014 Где: Санкт-Петербург Репутация: нет Всего: нет |
Немного доработал Test.
Вроде удалось проблему решить. Присоединённый файл ( Кол-во скачиваний: 2 ) ![]() |
|||
|
||||
kuvshinka |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 386 Регистрация: 27.4.2008 Репутация: нет Всего: нет |
ALEXRAGE: уже лучше, программа на зависает, спасибо за пример, но мне надо немного другое - чтобы диалог появлялся при, допустим Xmouse main-формы<=100 и, если указатель мыши находится на диалоге, то диалог виден, при выходе курсора за пределы диалога последний должен исчезать...
|
|||
|
||||
ALEXRAGE |
|
|||
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 17.1.2014 Где: Санкт-Петербург Репутация: нет Всего: нет |
Ну тогда нужно создать свой класс-обертку "меню". Относледовать его от QMenu и переопределить методы enterEvent и leaveEvent. Ну и в leaveEvent соответственно прописать this->hide(). |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |