crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> grabMouse() и потеря событий
ernie
  опции профиля:
сообщение 25.4.2011, 16:50
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 130
Регистрация: 13.5.2010
Из: Irkutsk
Пользователь №: 1712

Спасибо сказали: 11 раз(а)




Репутация:   1  


Доброго времени суток,господа.Столкнулся с такой проблемой,периодически(в основном после долгого аптайма винды) появляется проблема с grabMouse(),виджет мышь грабит,но никакие события не приходят на него,в том числе и releaseEvent(),соответсвенно пока не нажму какой-нибудь шоткат виндовый,мышь остаётся захваченной виджетом,после перезагрузки всё снова работает нормально,какие могут быть причины такого поведения?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
wiz29
  опции профиля:
сообщение 25.4.2011, 17:23
Сообщение #2


Старейший участник
****

Группа: Участник
Сообщений: 600
Регистрация: 7.7.2010
Из: Санкт-Петербург
Пользователь №: 1866

Спасибо сказали: 94 раз(а)




Репутация:   12  


This widget receives all mouse events until releaseMouse() is called; other widgets get no mouse events at all. Keyboard events are not affected. Use grabKeyboard() if you want to grab that.
Warning: Bugs in mouse-grabbing applications very often lock the terminal. Use this function with extreme caution, and consider using the -nograb command line option while debugging.

Подобных вещей лучше избегать, как и советуют ребята из trolltech, обычно есть возможности обойтись без вызова на виджет grabMouse().
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ernie
  опции профиля:
сообщение 25.4.2011, 17:23
Сообщение #3


Участник
**

Группа: Участник
Сообщений: 130
Регистрация: 13.5.2010
Из: Irkutsk
Пользователь №: 1712

Спасибо сказали: 11 раз(а)




Репутация:   1  


wiz29, я это читал:)но как обойтись без этого пока не понимаю,ибо надо чтобы pressEvent сохранился у виджета при смене парента.

Сообщение отредактировал ernie - 25.4.2011, 17:24
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
wiz29
  опции профиля:
сообщение 25.4.2011, 17:26
Сообщение #4


Старейший участник
****

Группа: Участник
Сообщений: 600
Регистрация: 7.7.2010
Из: Санкт-Петербург
Пользователь №: 1866

Спасибо сказали: 94 раз(а)




Репутация:   12  


чтобы понять что происходит, нужно детально смотреть код твоего виджета - "перехватчика" мыши. скорее всего просто не вызываешь releaseMouse() в определенный момент.

Цитата(ernie @ 25.4.2011, 18:23) *
ибо надо чтобы pressEvent сохранился у виджета при смене парента.

Что нужно конкретно опиши подробнее.

если нужно просто транслировать перемещение мыши из одного виджета в другой то проблем вообще никаких нет... можно и без захвата мыши обойтись.

Сообщение отредактировал wiz29 - 25.4.2011, 17:27
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ernie
  опции профиля:
сообщение 25.4.2011, 17:32
Сообщение #5


Участник
**

Группа: Участник
Сообщений: 130
Регистрация: 13.5.2010
Из: Irkutsk
Пользователь №: 1712

Спасибо сказали: 11 раз(а)




Репутация:   1  


wiz29,проблема в том,что в принципе всё работает,может месяц спокойно отпахать без глюков,но иногда всё ломается,причем по неизвестной причине,помогает только перезагрузка компьютера.Где-то читал,что в винде есть глюк с releaseMouse(),но главная проблема то в том что виджет перестаёт принимать события

В общем задача,есть виджет,что-то типа дока,на нём расположены еще виджеты,нужно реализовать перемещение виджетов вне дока по зажатию левой кнопки мыши и движению мыши.Чтобы снять виджет с дока,я ему меняю парента в 0 и двигаю в область нажатия,но при этом press на виджете теряется,т.е. надо еще раз на него жать,чтобы тащить его куда-нибудь
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
wiz29
  опции профиля:
сообщение 25.4.2011, 17:39
Сообщение #6


Старейший участник
****

Группа: Участник
Сообщений: 600
Регистрация: 7.7.2010
Из: Санкт-Петербург
Пользователь №: 1866

Спасибо сказали: 94 раз(а)




Репутация:   12  


Цитата(ernie @ 25.4.2011, 18:32) *
но при этом press на виджете теряется,т.е. надо еще раз на него жать,чтобы тащить его куда-нибудь

на ком остается фокус ввода (мыши) и кому продолжают приходить события мыши в этом случае?

в твоем случае получается grabMouse() некий костыль, для того чтобы не делать свой DocWidgetArea по сути, мне такая задача предстоит в ближайшей перспективе, тк многие вещи из стандартной реализации библиотеки не устраивают.

Сообщение отредактировал wiz29 - 25.4.2011, 17:36
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ernie
  опции профиля:
сообщение 25.4.2011, 17:42
Сообщение #7


Участник
**

Группа: Участник
Сообщений: 130
Регистрация: 13.5.2010
Из: Irkutsk
Пользователь №: 1712

Спасибо сказали: 11 раз(а)




Репутация:   1  


а как я могу посмотреть кому в денный момент события мыши приходят и на ком фокус?просто на виджетах в обработчиках поглядеть или есть другой способ что-нибудь вроде QWidget::mouseGrabber?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
wiz29
  опции профиля:
сообщение 25.4.2011, 17:44
Сообщение #8


Старейший участник
****

Группа: Участник
Сообщений: 600
Регистрация: 7.7.2010
Из: Санкт-Петербург
Пользователь №: 1866

Спасибо сказали: 94 раз(а)




Репутация:   12  


Цитата(ernie @ 25.4.2011, 18:42) *
а как я могу посмотреть кому в денный момент события мыши приходят и на ком фокус?просто на виджетах в обработчиках поглядеть или есть другой способ что-нибудь вроде QWidget::mouseGrabber?

Через QApplication статические методы. а мышиные события только через соответствующие обработчики, конкретных типов виджетов
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ernie
  опции профиля:
сообщение 25.4.2011, 18:05
Сообщение #9


Участник
**

Группа: Участник
Сообщений: 130
Регистрация: 13.5.2010
Из: Irkutsk
Пользователь №: 1712

Спасибо сказали: 11 раз(а)




Репутация:   1  


С виджета фокус уходит,это точно ,ибо hasFocus() возвращает false , это даже с учётом того,что я поставил eventFilter и офильтровал ParentChangeEvent и LeaveEvent у виджета

QApplication::focusWidget возвращает ноль,т.е. как я понимаю фокус вообще уходит

В моем случае на виджете вообще фокуса нет,как я понимаю,ибо даже до смены парента,hasFocus возвращает false

посмотрел moveEvent,пока кнопку не отожмёшь ни один виджет приложения не воспринимает event этот
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
wiz29
  опции профиля:
сообщение 26.4.2011, 8:26
Сообщение #10


Старейший участник
****

Группа: Участник
Сообщений: 600
Регистрация: 7.7.2010
Из: Санкт-Петербург
Пользователь №: 1866

Спасибо сказали: 94 раз(а)




Репутация:   12  


а принудительно устанавливать фокус не помогает?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 28.3.2024, 16:21