Название: [РЕШЕНО почти] grabMouse in QDialog Отправлено: vintik от Июнь 04, 2013, 18:03 Всем привет, столкнулся с проблемой, самостоятельно решить не могу.
Конечная цель уметь вызывать в приложении диалог, который бы перехватывал и обрабатывал все события мыши (в частности события колёсика). Делаю примерно так (хотя пробовал по-всякому - но работать заставить не удалось) Код: void MainWindow::on_menuModal_dialog_triggered(QAction *action) где: Код: int modal_dialog_wrapper::exec() Не работает и всё тут. Попробовал написать совсем простой пример Код: #include <QApplication> Не работает. Однако если раскомментить повторные вызовы w.grabMouse(); - работает. Юзаю Qt-4.8.3. Ось kubuntu 12.10 Название: Re: grabMouse in QDialog Отправлено: gil9red от Июнь 04, 2013, 18:12 Код: #include <QApplication> Название: Re: grabMouse in QDialog Отправлено: vintik от Июнь 04, 2013, 18:26 Код: #include <QApplication> Не понял ответа - тут просто будет создан виджет и всё. Никаким захватом мыши и не пахнет. Ведь смысл перехватывать ВСЕ нажатия, даже мимо виджета. Название: Re: grabMouse in QDialog Отправлено: gil9red от Июнь 04, 2013, 18:29 Тьфу, не обратил внимание
замените QWidget на QDialog и вызовите у него метод exec() Код: QDialog w; окно станет модальным Название: Re: grabMouse in QDialog Отправлено: vintik от Июнь 04, 2013, 18:39 Ок, усложняем задачу. Такой код
Код: #include <QApplication> Код: #ifndef WIDGET_H Код: #include "widget.h" ui файл - просто виджет, внутри которого установлен QFrame (ui->frame) Под kubuntu 12.10 мышь не будет захвачена Название: Re: grabMouse in QDialog Отправлено: gil9red от Июнь 04, 2013, 19:16 Уберите этот код
Код: ui->frame->show(); main.cpp: Код: #include <QApplication> Или я вообще ничего не могу понять :) Название: Re: grabMouse in QDialog Отправлено: vintik от Июнь 04, 2013, 19:31 мне необходимо, чтобы после отображения на экране диалога любые события мыши были перехвачены.
Даже если делается клик мимо диалога или колесо вращается не над ним мне нужно отловить это событие в этом диалоге. Согласно докам для этого служит метод grabMouse, но вот как его заставить правильно работать - я не понимаю Название: Re: grabMouse in QDialog Отправлено: GreatSnake от Июнь 04, 2013, 20:36 QWidget::show() асинхронный вызов, т.е. наличие окна после него не является обязательным.
Перегрузи QWidget::showEvent() и уже в нём делай граб. Название: Re: grabMouse in QDialog Отправлено: vintik от Июнь 05, 2013, 00:43 QWidget::show() асинхронный вызов, т.е. наличие окна после него не является обязательным. Перегрузи QWidget::showEvent() и уже в нём делай граб. Это интересно, спасибо, не знал попробовал сделать так, но не заработало Код: void Widget::showEvent(QShowEvent *event) Вообще, в доке написано, что это событие (showEvent) - если оно non spontaneous - приходит до появления окна (а оно именно non spontaneous). А как бы получить уведомление от оконной системы, что окно уже реально видимо? Кстати, попробовал сделать grabMouse() с задержкой Код: QTimer::singleShot(100, this, SLOT(timeout_slot())); // в timeout_slot() делаю ui->frame->grabMouse() и так вот работает. Так что мы на верном пути, осталось понять как его "завершить" |