Qt: захват события до потомка

У меня есть StackedWidget, и я хочу захватить все mouseClickEvents его потомков, независимо от их типов. Они могут быть добавлены и удалены позже (удалены из stackedWidget, а не удалены). Как я могу сделать эту работу?

1

Решение

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

Пример (изменено из документации)

bool FilterObject::eventFilter(QObject *obj, QEvent *event)
{
if (obj == textEdit) {
if (event->type() == QEvent::mousePress) {
QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event);
qDebug() << "Ate mouse press" << mouseEvent->x() << " " << mouseEvent->y();
return true;
} else {
return false;
}
} else {
// pass the event on to the parent class
return FilterObject::eventFilter(obj, event);
}
}

Чтобы установить фильтр событий после создания виджета, выполните следующие действия.

 FilterObject * filterObj = new FitlerObject(this);

Q_FOREACH(QObject obj, pWin->children())
{
obj->installEventFilter(filterObj);
}

Вы можете найти полный документ на http://qt-project.org/doc/qt-4.8/qobject.html#eventFilter а также http://qt-project.org/doc/qt-4.8/qobject.html#installEventFilter

0

Другие решения

Вот объяснение того, как получить дочерние элементы управления событиями:

http://falsinsoft.blogspot.com/2014/04/qt-get-child-controls-events.html

По сути, это фильтр событий, как уже предлагалось. Однако «проблема» заключается в том, как установить фильтр в случае, если ваш графический интерфейс окна управляется с помощью инструмента Qt Designer. В этом случае у вас нет прямого контроля над кодом, создающим дочерние элементы управления, и вам нужно использовать альтернативный способ получения событий «ChildAdded» вашего основного объекта для установки фильтра в каждый новый добавленный дочерний элемент управления, как описано в ссылка выше.

0

По вопросам рекламы [email protected]