Russian Qt Forum
Ноябрь 01, 2024, 11:35 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QMouseEvent - вопрос по обработке событий  (Прочитано 9189 раз)
Anarion
Гость
« : Декабрь 09, 2009, 02:31 »

Здравствуйте. Решил я было реализовать свой вариант Сапера средствами Qt. Пишу под виндой. В качестве ячеек поля решил использовать наследуемый от QLabel класс Label. Вопрос возник с работой мыши, точнее перехватом от нее сообщений. Есть там такой режим в сапере, когда при зажатой левой кнопке мыши можно двигать курсор по полю и при этом ячейки под курсором будут какбы нажиматься. Для отлавливания событий входа и выхода из виджета (т.е. объекта Label) переопределил методы enterEvent(QEvent *event) и leaveEvent(QEvent *event). Для проверки просто оставил:

Код:
/*virtual*/
void Label::enterEvent(QEvent *event)
{
  qDebug() << "enterEvent";
}

/*virtual*/
void Label::leaveEvent(QEvent *event)
{
  qDebug() << "leaveEvent";
}

/*virtual*/
void Label::mouseMoveEvent(QMouseEvent* event)
{
  if (QApplication::mouseButtons() & Qt::LeftButton)
    qDebug() << "mouseMoveEvent";
}

Также переопределил метод mouseMoveEvent(QMouseEvent* event) чтобы изменять параметры виджета в процессе перемещения курсора. Проблема заключается в следующем:
Если свободно водить курсором по этим виджетам, то в дебаг выводятся только сообщения enterEvent и leaveEvent. Это вроде как нормально. Но вот при нажатии левой кнопке выводятся только сообщения mouseMoveEvent, т.е. события enterEvent и leaveEvent перестают обрабатываться, и, соответственно виджеты не изменяются (изменение хочу как раз таки сделать по событиям enterEvent и leaveEvent). По незнанию предположил, что при зажатой кнопке включается режим перетаскивания, однако переопределение соответсвующих методов и аналогичный вывод информации в дебаг показали, что эти события не обрабатываются. При создании виджетов сразу вызываю метод setMouseTracking(true).
Подскажите пожалуйста, в чем я неправ или дайте пожалуйста совет, как лучше поступить с обработкой этих событий.
Заранее благодарен.
Записан
Dendy
Гость
« Ответ #1 : Декабрь 09, 2009, 04:05 »

В Qt используется политика захвата мыши окном, на котором была сделан клик. То-есть после нажатия все события получает окно, на котором нажали, с произвольными координатами, выходящими за пределы этого окна. Если хочется такой же внешний вид - лучше создайте одно окно с переопределёнными mouse*Event() и paintEvent(), на котором квадратики будут нарисованы, к примеру, с помощью qDrawWinButton().
Записан
Anarion
Гость
« Ответ #2 : Декабрь 09, 2009, 12:56 »

Спасибо большое за разъяснения. Просто при обработке хотелось бы работать именно с виджетами, т.к. каждый бы определялся при клике(например), и можно было обрабатывать сразу используемый виджет (отобразить флажок на клетке при нажатии ПКМ). А если для отображения использовать просто картинку, то сначала придется искать, какая же ячейка была нажата.
Записан
Dendy
Гость
« Ответ #3 : Декабрь 09, 2009, 15:12 »

Это можно сделать с помощью Drag'n'Drop, как будто нажатая кнопка перетягивается на другую кнопку. Можно попробовать делать QWidget::releaseMouse() внутри QWidget::mousePressEvent(), можно ещё мапить координаты мыши от нажатой кнопки до родительского окна, а потом смотреть какая именно кнопка под ним. Но всё это хаки. Рекомендую отказаться от идеи с кучей виджетов, это ненужный в данном случае оверхед.
Записан
Anarion
Гость
« Ответ #4 : Декабрь 09, 2009, 18:40 »

Спасибо большое. Прислушался к совету, переопределил QFrame и в нем уже разобрался со всеми обработчиками. Обрабатываю просто координаты этого одного виджета. В принципе, добился чего хотел.
Еще раз, спасибо. Думаю, тему можно закрывать.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.056 секунд. Запросов: 21.