![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
ernie |
![]()
Сообщение
#1
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 130 Регистрация: 13.5.2010 Из: Irkutsk Пользователь №: 1712 Спасибо сказали: 11 раз(а) Репутация: ![]() ![]() ![]() |
Доброго времени суток,господа.Столкнулся с такой проблемой,периодически(в основном после долгого аптайма винды) появляется проблема с grabMouse(),виджет мышь грабит,но никакие события не приходят на него,в том числе и releaseEvent(),соответсвенно пока не нажму какой-нибудь шоткат виндовый,мышь остаётся захваченной виджетом,после перезагрузки всё снова работает нормально,какие могут быть причины такого поведения?
|
|
|
wiz29 |
![]()
Сообщение
#2
|
![]() Старейший участник ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 600 Регистрация: 7.7.2010 Из: Санкт-Петербург Пользователь №: 1866 Спасибо сказали: 94 раз(а) Репутация: ![]() ![]() ![]() |
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 |
![]()
Сообщение
#3
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 130 Регистрация: 13.5.2010 Из: Irkutsk Пользователь №: 1712 Спасибо сказали: 11 раз(а) Репутация: ![]() ![]() ![]() |
wiz29, я это читал
![]() Сообщение отредактировал ernie - 25.4.2011, 17:24 |
|
|
wiz29 |
![]()
Сообщение
#4
|
![]() Старейший участник ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 600 Регистрация: 7.7.2010 Из: Санкт-Петербург Пользователь №: 1866 Спасибо сказали: 94 раз(а) Репутация: ![]() ![]() ![]() |
чтобы понять что происходит, нужно детально смотреть код твоего виджета - "перехватчика" мыши. скорее всего просто не вызываешь releaseMouse() в определенный момент.
ибо надо чтобы pressEvent сохранился у виджета при смене парента. Что нужно конкретно опиши подробнее. если нужно просто транслировать перемещение мыши из одного виджета в другой то проблем вообще никаких нет... можно и без захвата мыши обойтись. Сообщение отредактировал wiz29 - 25.4.2011, 17:27 |
|
|
ernie |
![]()
Сообщение
#5
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 130 Регистрация: 13.5.2010 Из: Irkutsk Пользователь №: 1712 Спасибо сказали: 11 раз(а) Репутация: ![]() ![]() ![]() |
wiz29,проблема в том,что в принципе всё работает,может месяц спокойно отпахать без глюков,но иногда всё ломается,причем по неизвестной причине,помогает только перезагрузка компьютера.Где-то читал,что в винде есть глюк с releaseMouse(),но главная проблема то в том что виджет перестаёт принимать события
В общем задача,есть виджет,что-то типа дока,на нём расположены еще виджеты,нужно реализовать перемещение виджетов вне дока по зажатию левой кнопки мыши и движению мыши.Чтобы снять виджет с дока,я ему меняю парента в 0 и двигаю в область нажатия,но при этом press на виджете теряется,т.е. надо еще раз на него жать,чтобы тащить его куда-нибудь |
|
|
wiz29 |
![]()
Сообщение
#6
|
![]() Старейший участник ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 600 Регистрация: 7.7.2010 Из: Санкт-Петербург Пользователь №: 1866 Спасибо сказали: 94 раз(а) Репутация: ![]() ![]() ![]() |
но при этом press на виджете теряется,т.е. надо еще раз на него жать,чтобы тащить его куда-нибудь на ком остается фокус ввода (мыши) и кому продолжают приходить события мыши в этом случае? в твоем случае получается grabMouse() некий костыль, для того чтобы не делать свой DocWidgetArea по сути, мне такая задача предстоит в ближайшей перспективе, тк многие вещи из стандартной реализации библиотеки не устраивают. Сообщение отредактировал wiz29 - 25.4.2011, 17:36 |
|
|
ernie |
![]()
Сообщение
#7
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 130 Регистрация: 13.5.2010 Из: Irkutsk Пользователь №: 1712 Спасибо сказали: 11 раз(а) Репутация: ![]() ![]() ![]() |
а как я могу посмотреть кому в денный момент события мыши приходят и на ком фокус?просто на виджетах в обработчиках поглядеть или есть другой способ что-нибудь вроде QWidget::mouseGrabber?
|
|
|
wiz29 |
![]()
Сообщение
#8
|
![]() Старейший участник ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 600 Регистрация: 7.7.2010 Из: Санкт-Петербург Пользователь №: 1866 Спасибо сказали: 94 раз(а) Репутация: ![]() ![]() ![]() |
а как я могу посмотреть кому в денный момент события мыши приходят и на ком фокус?просто на виджетах в обработчиках поглядеть или есть другой способ что-нибудь вроде QWidget::mouseGrabber? Через QApplication статические методы. а мышиные события только через соответствующие обработчики, конкретных типов виджетов |
|
|
ernie |
![]()
Сообщение
#9
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 130 Регистрация: 13.5.2010 Из: Irkutsk Пользователь №: 1712 Спасибо сказали: 11 раз(а) Репутация: ![]() ![]() ![]() |
С виджета фокус уходит,это точно ,ибо hasFocus() возвращает false , это даже с учётом того,что я поставил eventFilter и офильтровал ParentChangeEvent и LeaveEvent у виджета
QApplication::focusWidget возвращает ноль,т.е. как я понимаю фокус вообще уходит В моем случае на виджете вообще фокуса нет,как я понимаю,ибо даже до смены парента,hasFocus возвращает false посмотрел moveEvent,пока кнопку не отожмёшь ни один виджет приложения не воспринимает event этот |
|
|
wiz29 |
![]()
Сообщение
#10
|
![]() Старейший участник ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 600 Регистрация: 7.7.2010 Из: Санкт-Петербург Пользователь №: 1866 Спасибо сказали: 94 раз(а) Репутация: ![]() ![]() ![]() |
а принудительно устанавливать фокус не помогает?
|
|
|
![]() ![]() ![]() |
![]() |
Текстовая версия | Сейчас: 11.3.2025, 12:22 |