Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перемещение мыши 
V
    Опции темы
kuvshinka
Дата 23.1.2014, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 386
Регистрация: 27.4.2008

Репутация: нет
Всего: нет



На главной форме приложения при определенной X-координате мыши появляется всплывающее меню QMenu, после чего при движении мыши не срабатывает метод mouseMoveEvent(QMouseEvent *event) главной формы, наверное из-за передачи фокуса в появившееся меню...как мне сделать так, чтобы при движении мыши по главной форме ВСЕГДА срабатывал бы ее метод mouseMoveEvent?

Делаю так
Код

Mainclass::Mainclass()
{
 this->setMouseTracking(true);
 myMenu = new QMenu(this);
 myMenu->setFocusPolicy(Qt::NoFocus); // не помогает
}
////-----------------------------------------------------------------------------------
void Mainclass::mouseMoveEvent(QMouseEvent *event)
{
 if (event->pos().x()>100)
   myMenu->show();
 else
  myMenu->hide();
}
////-----------------------------------------------------------------------------------

PM MAIL   Вверх
vinter
Дата 23.1.2014, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 3
Всего: 56



поставь фильтр(installEventFilter) на сообщения QMenu, и верни для MouseMove false.


--------------------
Мой блог
PM MAIL WWW   Вверх
kuvshinka
Дата 23.1.2014, 21:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 386
Регистрация: 27.4.2008

Репутация: нет
Всего: нет



vinter: а можно примерчик, а то я что-то не поняла что к чему надо сделать...
PM MAIL   Вверх
vinter
Дата 24.1.2014, 09:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 3
Всего: 56



посмотри документацию к installEventFilter, там есть пример


--------------------
Мой блог
PM MAIL WWW   Вверх
kuvshinka
Дата 27.1.2014, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 386
Регистрация: 27.4.2008

Репутация: нет
Всего: нет



Пробую так
Код


Mainclass::Mainclass()
{
 this->setMouseTracking(true);
 myMenu = new QMenu(this);
 myMenu->setFocusPolicy(Qt::NoFocus); // не помогает
 myMenu ->installEventFilter(this);
}

bool Mainclass::eventFilter(QObject *obj, QEvent *ev)
{
    if (ev->type() == QEvent::MouseMove)
    {
     qDebug() << "filter...";
     return true;
   }
}

вообще не вызывается eventFilter при отображении myMenu  и что значит «верни для MouseMove false»? Подскажите пож-та что неверно в моем примере и как это исправить...
PM MAIL   Вверх
vinter
Дата 27.1.2014, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 3
Всего: 56



Попробуй так:
Код

Mainclass::Mainclass()
{
 this->setMouseTracking(true);
 myMenu = new QMenu(this);
 myMenu->setMouseTracking(true);
 myMenu ->installEventFilter(this);
}

bool Mainclass::eventFilter(QObject *obj, QEvent *ev)
{
    if (ev->type() == QEvent::MouseMove)
    {
     qDebug() << "filter...";
     return false;
   }
   return true;
}



--------------------
Мой блог
PM MAIL WWW   Вверх
kuvshinka
Дата 28.1.2014, 09:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 386
Регистрация: 27.4.2008

Репутация: нет
Всего: нет



vinter, К указанному Вами выше примеру добавляю
Код

void Mainclass::mouseMoveEvent(QMouseEvent *event)
{
    qDebug() << "mouse pos:  " << event->pos().x();

    if (event->pos().x()>=100)
     myMenu->show();   
    // else
    // myMenu->hide();
}

в итоге после появления всплывающего меню ПРОГРАММА и КОМПЬЮТЕР ЗАВИСАЮТ...
PM MAIL   Вверх
vinter
Дата 28.1.2014, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 3
Всего: 56



kuvshinka, я тебе показал, как пропустить события MoseMove из меню в изначальную форму. Как справляться с остальным? Думай сама, для меня эта ситуация выглядит глупой т.к. меню, не должно отдавать мышь форме. Видимо у тебя какая-то логика с этим связана, а значит решай как тебе поступать. 
"Висит" у тебя, скорее всего из-за перекрестных событий, которые попадают в цикл зависимости друг от друга.
В качестве варианта, можно попробовать выставлять флаг, когда меню показано и не выполнять if (event->pos().x()>=100) в этом случае. В общем надо смотреть с дебагером и разбираться.

Добавлено через 55 секунд
P.S. Компьютер не должен зависать из-за одной программы.


--------------------
Мой блог
PM MAIL WWW   Вверх
ALEXRAGE
Дата 28.1.2014, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 17.1.2014
Где: Санкт-Петербург

Репутация: нет
Всего: нет



Думаю просто нужно передать QMouseEvent *event дальше на обработку.
Что-то типа QMenu::mouseMoveEvent(event);


PM MAIL   Вверх
kuvshinka
Дата 29.1.2014, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 386
Регистрация: 27.4.2008

Репутация: нет
Всего: нет



vinter:
Да нет там никакой особой логики – в новый проект вставила ваш пример + мой обработчик mouseMoveEvent (см. Test.rar) и получается такое зависание (а компьютер зависает, если программу запустить под убунтой, под виндой программа тоже виснет, но ее можно хотя бы остановить).

Присоединённый файл ( Кол-во скачиваний: 2 )
Присоединённый файл  Test.rar 9,18 Kb
PM MAIL   Вверх
vinter
Дата 29.1.2014, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 3
Всего: 56



kuvshinka, логика у тебя уже есть. Ты пытаешься прокидывать сообщения из контекстного меню на форму. Но в обработчике этих сообщений ты манипулируешь меню. Не видишь рекурсии? Ты должна разобраться с этим, это твоя логика. Она должна исключить рекурсию. 

С помощью отладчика тоже можно довольно быстро отыскать проблему.


--------------------
Мой блог
PM MAIL WWW   Вверх
kuvshinka
Дата 29.1.2014, 21:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 386
Регистрация: 27.4.2008

Репутация: нет
Всего: нет



да даже если я перенесу код отображения диалога, допустим, в онклик кнопки и соответственно оставлю Mainclass::mouseMoveEvent пустым и даже если и Mainclass::eventFilter(QObject *obj, QEvent *ev) сделаю пустым, то все равно меню будет появляться без его пунктов и программа подвиснет...
PM MAIL   Вверх
ALEXRAGE
Дата 30.1.2014, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 17.1.2014
Где: Санкт-Петербург

Репутация: нет
Всего: нет



Немного доработал Test.
Вроде удалось проблему решить. 

Присоединённый файл ( Кол-во скачиваний: 2 )
Присоединённый файл  New_Test.rar 27,66 Kb
PM MAIL   Вверх
kuvshinka
Дата 31.1.2014, 22:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 386
Регистрация: 27.4.2008

Репутация: нет
Всего: нет



ALEXRAGE: уже лучше, программа на зависает, спасибо за пример, но мне надо немного другое - чтобы диалог появлялся при, допустим Xmouse main-формы<=100 и, если указатель мыши находится на диалоге, то диалог виден, при выходе курсора за пределы диалога последний должен исчезать...
PM MAIL   Вверх
ALEXRAGE
Дата 3.2.2014, 09:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 17.1.2014
Где: Санкт-Петербург

Репутация: нет
Всего: нет



Цитата(kuvshinka @ 31.1.2014,  22:00)
если указатель мыши находится на диалоге, то диалог виден, при выходе курсора за пределы диалога последний должен исчезать...

Ну тогда нужно создать свой класс-обертку "меню". Относледовать его от QMenu и переопределить методы enterEvent и leaveEvent. Ну и в leaveEvent соответственно прописать this->hide().  
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0870 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.