#include <QApplication>
#include <QDebug>
#include <QEvent>
#include <QWidget>

class MyWidget : public QWidget
{
public:
    using QWidget::QWidget;
    ~MyWidget() override { qDebug() << "~MyWidget"; }
};

class MyWindowPrivate
{
public:
    ~MyWindowPrivate() {
        // Sometimes we want to delete children explicitely,
        // e.g. to have some control over the order of destruction
        delete m_child;
    }
    MyWidget *m_child;
};

class MyWindow : public QWidget
{
public:
    explicit MyWindow(QWidget *parent = nullptr)
        : QWidget(parent), d(new MyWindowPrivate)
    {
        d->m_child = new MyWidget(this);
        d->m_child->installEventFilter(this);
    }
    ~MyWindow() override {
        qDebug() << "~MyWindow";
    }
protected:
    bool eventFilter(QObject *object, QEvent *event) override
    {
        if (object == d->m_child) {
            qDebug() << "got event" << event->type();
            if (event->type() == QEvent::MouseButtonPress) {
                // do something
            }
        }
        return QWidget::eventFilter(object, event);
    }
private:
    std::unique_ptr<MyWindowPrivate> d;
};

int main(int argc, char** argv)
{
    QApplication app(argc, argv);

    MyWindow window;
    window.show();

    return 0; // app.exec();
}
