Название: QMouseEvent - вопрос по обработке событий Отправлено: Anarion от Декабрь 09, 2009, 02:31 Здравствуйте. Решил я было реализовать свой вариант Сапера средствами Qt. Пишу под виндой. В качестве ячеек поля решил использовать наследуемый от QLabel класс Label. Вопрос возник с работой мыши, точнее перехватом от нее сообщений. Есть там такой режим в сапере, когда при зажатой левой кнопке мыши можно двигать курсор по полю и при этом ячейки под курсором будут какбы нажиматься. Для отлавливания событий входа и выхода из виджета (т.е. объекта Label) переопределил методы enterEvent(QEvent *event) и leaveEvent(QEvent *event). Для проверки просто оставил:
Код: /*virtual*/ Также переопределил метод mouseMoveEvent(QMouseEvent* event) чтобы изменять параметры виджета в процессе перемещения курсора. Проблема заключается в следующем: Если свободно водить курсором по этим виджетам, то в дебаг выводятся только сообщения enterEvent и leaveEvent. Это вроде как нормально. Но вот при нажатии левой кнопке выводятся только сообщения mouseMoveEvent, т.е. события enterEvent и leaveEvent перестают обрабатываться, и, соответственно виджеты не изменяются (изменение хочу как раз таки сделать по событиям enterEvent и leaveEvent). По незнанию предположил, что при зажатой кнопке включается режим перетаскивания, однако переопределение соответсвующих методов и аналогичный вывод информации в дебаг показали, что эти события не обрабатываются. При создании виджетов сразу вызываю метод setMouseTracking(true). Подскажите пожалуйста, в чем я неправ или дайте пожалуйста совет, как лучше поступить с обработкой этих событий. Заранее благодарен. Название: Re: QMouseEvent - вопрос по обработке событий Отправлено: Dendy от Декабрь 09, 2009, 04:05 В Qt используется политика захвата мыши окном, на котором была сделан клик. То-есть после нажатия все события получает окно, на котором нажали, с произвольными координатами, выходящими за пределы этого окна. Если хочется такой же внешний вид - лучше создайте одно окно с переопределёнными mouse*Event() и paintEvent(), на котором квадратики будут нарисованы, к примеру, с помощью qDrawWinButton().
Название: Re: QMouseEvent - вопрос по обработке событий Отправлено: Anarion от Декабрь 09, 2009, 12:56 Спасибо большое за разъяснения. Просто при обработке хотелось бы работать именно с виджетами, т.к. каждый бы определялся при клике(например), и можно было обрабатывать сразу используемый виджет (отобразить флажок на клетке при нажатии ПКМ). А если для отображения использовать просто картинку, то сначала придется искать, какая же ячейка была нажата.
Название: Re: QMouseEvent - вопрос по обработке событий Отправлено: Dendy от Декабрь 09, 2009, 15:12 Это можно сделать с помощью Drag'n'Drop, как будто нажатая кнопка перетягивается на другую кнопку. Можно попробовать делать QWidget::releaseMouse() внутри QWidget::mousePressEvent(), можно ещё мапить координаты мыши от нажатой кнопки до родительского окна, а потом смотреть какая именно кнопка под ним. Но всё это хаки. Рекомендую отказаться от идеи с кучей виджетов, это ненужный в данном случае оверхед.
Название: Re: QMouseEvent - вопрос по обработке событий Отправлено: Anarion от Декабрь 09, 2009, 18:40 Спасибо большое. Прислушался к совету, переопределил QFrame и в нем уже разобрался со всеми обработчиками. Обрабатываю просто координаты этого одного виджета. В принципе, добился чего хотел.
Еще раз, спасибо. Думаю, тему можно закрывать. |