У меня есть StackedWidget, и я хочу захватить все mouseClickEvents его потомков, независимо от их типов. Они могут быть добавлены и удалены позже (удалены из stackedWidget, а не удалены). Как я могу сделать эту работу?
Вы можете установить фильтр событий на все ваши дочерние виджеты, ваш фильтр событий может быть новым классом или существующим классом, важно то, что он реализует метод 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
Вот объяснение того, как получить дочерние элементы управления событиями:
http://falsinsoft.blogspot.com/2014/04/qt-get-child-controls-events.html
По сути, это фильтр событий, как уже предлагалось. Однако «проблема» заключается в том, как установить фильтр в случае, если ваш графический интерфейс окна управляется с помощью инструмента Qt Designer. В этом случае у вас нет прямого контроля над кодом, создающим дочерние элементы управления, и вам нужно использовать альтернативный способ получения событий «ChildAdded» вашего основного объекта для установки фильтра в каждый новый добавленный дочерний элемент управления, как описано в ссылка выше.