Обработка QEvent конкретного виджета

287
21 августа 2017, 09:53

Есть такой виджет:

Нужно обработать mousePressEvent только если клик произошел по виджету headerWidget, как это можно сделать не перегружая его?

Answer 1

Установите перехватчик событий:

headerWidget->installEventFilter(headerClickHandler);

где headerClickHandler — это переменная-экземпляр класса с временем жизни не меньше чем у headerWidget. Сам же класс-перехватчик должен быть унаследован от QObject и обрабатывать все необходимые события внутри своего eventFilter():

class HeaderClickHandler : public QObject
{
    // Q_OBJECT не нужен — мы не работаем с сигналами и слотами
protected:
    bool eventFilter(QObject* watched, QEvent* event)
    {
        // Так как mousePressEvent() — это лишь тонкая обёртка, вызываемая при
        // поступлении события QEvent::MouseButtonPress, то мы можем ловить
        // событие напрямую
#if __cplusplus >= 201103L
        assert(event);
#endif
        if(event->type() == QEvent::MouseButtonPress)
        {
            // Неявно предполагаем, что единственный перехватываемый объект —
            // это headerWidget
            // ... (производим все необходимые действия)
            // Позволяем передать сообщение далее, обработчику headerWidget-а
            return false;
        }
    }
}
READ ALSO
Pascal мне нужно перевести ее на C++. п [требует правки]

Pascal мне нужно перевести ее на C++. п [требует правки]

Само условие задачи такое :Дано целое четырехзначное числоОпределить, какая сумма больше - первой пары цифр числа или второй пары

309
QtCreator убрать отображение абсолютного пути

QtCreator убрать отображение абсолютного пути

Написал обычное тестовое приложение для выбораpng файла из папок на компьютере

228
Вернуть массив строк с++

Вернуть массив строк с++

Есть следующая задача: изначально мы не знаем размер массива, который нам надо обработать, необходимо написать функцию, которая бы работала...

311
Qt 5 статические библиотеки

Qt 5 статические библиотеки

Собрался попробовать использовать Qt 59

341