наведите курсор на прозрачность в Qt - PullRequest
2 голосов
/ 21 апреля 2009

Я пытаюсь создать приложение в Qt / C ++ с Qt4.5 и хочу, чтобы все активные окна меняли непрозрачность при наведении курсора мыши ...

Насколько я понимаю, в Qt нет явного события наведения мыши.

Однако, я получил элементарное функционирование, переопределив mousemoveevent () QWidget в классе, который объявляет мое главное окно. Но mousemoveevent главного окна не вызывается всякий раз, когда мышь перемещается по любому из групповых блоков, которые я там создал (понятно, так как QGroupbox имеет свое собственное переопределение mousemoveevent).

Так что в качестве дешевого обходного пути я все еще использую mousemoveevent моего главного окна, но запрашиваю глобальную позицию мыши и основываюсь на (x, y) позиции главного окна (полученной через -> pos ()) и Размер окна (-> size -> rHeight и rWidth), я проверяю, находится ли мышь в пределах области основного окна, и изменяю таким образом прозрачность.

Это имело очень ограниченный успех. Правая граница работает нормально, левая изменяет непрозрачность на 4 пикселя раньше. Верхняя часть не работает (предположительно, потому что мышь проходит через строку меню и строку заголовка), а нижняя часть меняется слишком рано.

Я подумал о создании пустого контейнера класса QWidget, а затем разместил там все остальное, но я чувствовал, что он все равно не решит большую проблему базового виджета, не получающего mousemoveevent, если он уже был реализован в дочернем элементе. виджет.

Пожалуйста, предложите любые исправления / ошибки, которые я сделал в моем методе или любые альтернативные методы для достижения этой цели.

p.s. Я сомневаюсь, что это важно, но я работаю с Qt Creator IDE, а не с интеграцией Qt в VS2008 (в любом случае, это одни и те же классы - другой компилятор, mingw )

Ответы [ 3 ]

2 голосов
/ 21 апреля 2009

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

http://doc.trolltech.com/4.5/eventsandfilters.html#event-filters

2 голосов
/ 21 апреля 2009

Установка фильтров событий для каждого из ваших дочерних виджетов может помочь. Это позволит вашему главному окну получать дочерние события, такие как события из групповых блоков. Вы можете найти пример кода здесь .

1 голос
/ 21 апреля 2009

Если я понимаю, что вы пытаетесь сделать, я бы переопределил виджет enterEvent () и оставилEvent (). Событие ввода мышью вызовет постепенное исчезновение, а exitEvent вызовет постепенное исчезновение.

РЕДАКТИРОВАТЬ: После перечитывания несколько раз, я все еще не уверен, что вы пытаетесь достичь. Извините, если мое предложение не поможет. : -)

...