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

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

2 ответа

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

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

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

Вы можете установить фильтр событий на все ваши дочерние виджеты, ваш фильтр событий может быть новым или существующим классом, важно то, что он реализует метод 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 и http://qt-project.org/doc/qt-4.8/qobject.html

Другие вопросы по тегам